Il existe de multiples options informatiques pour faire de la stylométrie. Nous nous proposons, dans ce cours, d’utiliser le package R nommé Stylo, mais d’autres options existent comme FactoMineR. Ce package étant développé par des français de l’agrocampus de Rennes, notons qu’une importante documentation en français est disponible, et permettra aux personnes intéressées de continuer leur apprentissage de la stylométrie.

Ce cours est disponible en ligne avec le corpus que nous utilisons dans ce notebook: on peut le trouver sur notre Github. Il est distribué avec une licence CC-BY.

Le corpus est constitué de pièces de théâtre du XVIIe siècle, disponibles sur le site www.theatre-classique.fr, rassemblées par J.-B. Camps (Ecole des Chartes) et adaptées par nous-mêmes pour correspondre aux besoins de ce cours.

1. Quelques remarques avant de commencer

1.1 Des ressources en ligne

Stylo est développé par Maciej Eder (Cravocie), Mike Kestmont (Anvers) et Jan Rybicki (Cravocie). On trouvera de nombreuses ressources sur le site de leur groupe de computational stylistics et sur leur GitHub, qui contient un repo consacré au package stylo avec de nombreuses informations sur son fonctionnement.

Pour ceux qui voudraient s’entraîner avec d’autres données que celles fournies pour le cours, un repo avec 100 romans anglais se trouve sur leur GitHub (cliquez sur le bouton vert Clone or download à droite pour télécharger le tout au format zip).

##1.2 À propos du corpus

Stylo a besoin de savoir où chercher les données (pour nous il s’agit de notre corpus) qu’il va utiliser, et celles-ci doivent impérativement obéir à trois règles simples:

  1. Tous les textes qui forment notre corpus de travail doivent se trouver dans un dossier intitulé corpus.
  2. Ce dossier corpus ne doit contenir que les fichiers du corpus: tout autre document se retrouverait analysé avec le reste, et perturberait les résultats.
  3. Les fichiers du corpus doivent utiliser un même format, soit en txt, soit en XML, soit en HTML.

##1.4 Préparer la session de travail

Nous devons préparer la session de travail, en désignant à R le fichier de notre ordinateur à partir duquel nous allons travailler pour qu’il trouve notre fichier corpus, et qu’il y sauvegarde nos résultats.

Pour indiquer où se trouve le fichier de travail, deux solutions sont possibles:

  • ou bien via le menu avec Session>Set Working Directory>Choose Directory
  • ou bien directement dans R avec la commande setwd (pour Set working directory), qui s’utilise de cette manière.
setwd("~/GitHub/Cours_2020_UniGE/Cours_Geneve_5")
#je charge les données que l'enseignant a préparé pour éviter les problèmes
#load("Cours_Geneve_5.RData")

On peut vérifier que le chemin vers le dossier de travail a bien été pris en compte avec une autre commande: getwd (pour Get working directory):

getwd()
[1] "/Users/gabaysimon/GitHub/Cours_2020_UniGE/Cours_Geneve_5"

Tout est en ordre? Avançons! installons stylo()

if(!require("stylo")){
  install.packages("stylo")
  library(stylo)
}
Loading required package: stylo

### stylo version: 0.6.9 ###

If you plan to cite this software (please do!), use the following reference:
    Eder, M., Rybicki, J. and Kestemont, M. (2016). Stylometry with R:
    a package for computational text analysis. R Journal 8(1): 107-121.
    <https://journal.r-project.org/archive/2016/RJ-2016-007/index.html>

To get full BibTeX entry, type: citation("stylo")

Il ne nous reste plus qu’à lancer stylo, avec la commande… stylo()!

#2. Le data clustering

##2.1 Ouvrir stylo

L’application Stylo peut être utilisée en ligne de commande, mais aussi avec une GUI (graphical user interface, en français “interface graphique”). Si vous voulez avoir un premier aperçu, retirez le # au début de la ligne infra et cliquez sur Run.

#stylo()

##2.2 Une première analyse de cluster

Nous allons désormais tenter une première analyse de cluster. Le data clustering (ou “partitionnement de données” en français) cherche à diviser un ensemble de données en différents “groupes” homogènes selon des caractéristiques qu’ils partagent. Ces groupes (dans notre cas des pièces de théâtre) sont formés à partir de calculs qui déterminent leur proximité (similarité ou distance).

Note importante Afin de gagner du temps, nous avons directement paramétré le formulaire de la GUI, mais la commande stylo() vide, comme précédemment (cf. 2.1), suffirait si les bonnes cases étaient bien cochées.

Lorsque vous appuyerez sur Run observez la console: une série de messages vous avertit de ce qu’il se passe.

stylo(gui=TRUE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min = 100, mfw.max = 100, mfw.incr=100,
      analysis.type = "CA", distance.measure = "manhattan",
      pca.visual.flavour = "classic")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
Calculating z-scores... 

Calculating Manhattan distances...
MFW used: 
100 
Processing metadata...


Assigning plot colors according to file names...

Reprenons le processus dans ses grandes lignes:

  1. loading…: Une fois la commande lancée, chaque texte est est chargé.
  2. Total nr. of samples…: On nous avertit du nombre de textes dans le corpus, qui sont tous éclatés en tokens (ici des mots).
  3. combining frequencies…: Le nombre d’occurrence de chaque token est calculé pour chaque document du corpus, pour former un tableau de fréquences.
  4. Calculating Manhattan distance: ces tableaux de fréquences permettent de voir si certains tokens reviennent de manière équivalente dans d’autres documents, et de produire les clusters. Nous allons revenir plusieurs fois sur ce point par la suite.

Regardons maintenant le graphique qui nous est donné. Il s’agit d’un dendogramme, qui est accompagné de quelques informations en bas de page (100 MFW Culled @ 0% Manhattan distance):

  • On remarque l’utilisation de différentes couleurs: tous les labels (les noms des fichiers formant le corpus) avec la même chaîne de caractères avant l’underscore (ici chaque auteur) ont la même, afin de simplifier la lecture des résultats.
  • 100 MFW Nous avons utilisé les 100 mots les plus fréquents. Pendant le traitement des données, Stylo a généré quelques fichiers qui nous permettent de voir quels sont ces mots, ainsi que leur fréquence. Allez dans votre dossier de travail, et regardez les documents wordlist.txt et table_with_frequencies.txt. Nous reviendrons plus tard sur ces données.
  • Culled @ 0%: Le culling est à 0%, ce qui signifie que les mots les plus fréquents peuvent être absents de certains textes. Un culling à 100% signifierait que nous ne retiendrions que les mots les plus fréquents retenus dans tous les textes.
  • Manhattan distance: Nous avons utilisé la distance dite “de Manhattan”, mais il en existe d’autres:
    • certaines sont partagées par tous les mathématiciens (euclidienne, Canberra, etc.).
    • certaines sont plus spécifiques à la stylométrie (delta classic ou “distance de Burrows”, cosine delta ou “distance de Würzburg”, etc.).

##2.3 Contrôler la fiabilité des résultats: répéter l’opérations avec d’autres paramètres

Nous avons obtenu un cluster: il est plausible, mais est-il fiable? Nous avons besoin d’encore plus de certitudes… Une première solution est de répéter le même clacul, en augmentant le nombre des mots les plus fréquents: passons de 100 à 1000.

stylo(gui=FALSE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min = 1000, mfw.max = 100, mfw.incr=100,
      analysis.type = "CA", distance.measure = "manhattan",
      pca.visual.flavour = "classic")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
Calculating z-scores... 

Calculating Manhattan distances...
MFW used: 
1000 
Processing metadata...


Assigning plot colors according to file names...

Les résultat est déjà moins net… À quel moment du bruit a-t-il commencé à perturber la formation des groupes? Afin de le savoir, nous pouvons demander à Stylo de répéter l’analyse de cluster un certain nombre de fois entre 100 et 1000.

Demandons à Stylo de refaire le calculs dix fois, en incrémentant de 100 à chaque fois.

stylo(gui=FALSE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min = 100, mfw.max = 1000, mfw.incr=100,
      analysis.type = "CA", distance.measure = "manhattan",
      pca.visual.flavour = "classic")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
Calculating z-scores... 

Calculating Manhattan distances...
MFW used: 
100 
Processing metadata...


Assigning plot colors according to file names...

300 
Processing metadata...


Assigning plot colors according to file names...

400 
Processing metadata...


Assigning plot colors according to file names...

500 
Processing metadata...


Assigning plot colors according to file names...

600 
Processing metadata...


Assigning plot colors according to file names...

700 
Processing metadata...


Assigning plot colors according to file names...

800 
Processing metadata...


Assigning plot colors according to file names...

900 
Processing metadata...


Assigning plot colors according to file names...

1000 
Processing metadata...


Assigning plot colors according to file names...

 

Function call:
stylo(gui = FALSE, corpus.dir = "corpus", corpus.format = "xml.drama",     corpus.lang = "French", analyzed.features = "w", mfw.min = 100,     mfw.max = 1000, mfw.incr = 100, analysis.type = "CA", distance.measure = "manhattan",     pca.visual.flavour = "classic")

Depending on your chosen options, some results should have been written
into a few files; you should be able to find them in your current
(working) directory. Usually, these include a list of words/features
used to build a table of frequencies, the table itself, a file containing
recent configuration, etc.

Advanced users: you can pipe the results to a variable, e.g.:
     my.boss.will.love.it = stylo()
this will create a class "my.boss.will.love.it" containing some presumably
interesting stuff. The class created, you can type, e.g.:
     summary(my.boss.will.love.it)
to see which variables are stored there and how to use them.


for suggestions how to cite this software, type: citation("stylo")

Difficile cependant de comparer facilement 10 dendogrammes… Et comment faire pour 20, 30 ou 1000 dendogrammes?

##2.4 Contrôler autrement la fiabilité des résultats: le consensus tree

Il est possible de représenter graphiquement la somme de ces informations: il s’agit du concensus tree (“arbre de consensus”, en français). Voyons la forme de ce graphique avec les résultats que nous venons d’obtenir.

stylo(gui=FALSE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min = 100, mfw.max = 1000, mfw.incr=100,
      analysis.type = "BCT", consensus.strength = 0.5,  distance.measure = "manhattan",
      pca.visual.flavour = "classic")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
Calculating z-scores... 

Calculating Manhattan distances...
MFW used: 
100 
Processing metadata...


Assigning plot colors according to file names...

200 
Processing metadata...


Assigning plot colors according to file names...

300 
Processing metadata...


Assigning plot colors according to file names...

400 
Processing metadata...


Assigning plot colors according to file names...

500 
Processing metadata...


Assigning plot colors according to file names...

600 
Processing metadata...


Assigning plot colors according to file names...

700 
Processing metadata...


Assigning plot colors according to file names...

800 
Processing metadata...


Assigning plot colors according to file names...

900 
Processing metadata...


Assigning plot colors according to file names...

1000 
Processing metadata...


Assigning plot colors according to file names...

 

C’est l’occasion de changer dans la méthode de calcul de distance, pour vérifier les performances de chacune. Nous utilisions jusqu’à présent la “distance de Manhattan”, essayons cette fois avec une distance euclidienne.

stylo(gui=FALSE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min = 100, mfw.max = 1000, mfw.incr=100,
      analysis.type = "BCT", consensus.strength = 0.5,  distance.measure = "euclidean",
      pca.visual.flavour = "classic")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
Calculating z-scores... 

Calculating Euclidean distances...
MFW used: 
100 
Processing metadata...


Assigning plot colors according to file names...

200 
Processing metadata...


Assigning plot colors according to file names...

300 
Processing metadata...


Assigning plot colors according to file names...

400 
Processing metadata...


Assigning plot colors according to file names...

500 
Processing metadata...


Assigning plot colors according to file names...

600 
Processing metadata...


Assigning plot colors according to file names...

700 
Processing metadata...


Assigning plot colors according to file names...

800 
Processing metadata...


Assigning plot colors according to file names...

900 
Processing metadata...


Assigning plot colors according to file names...

1000 
Processing metadata...


Assigning plot colors according to file names...

 

Et maintenant avec une distance typique de la stylométrie: la distance de Burrows (du nom de son inventeur, John Burrows), aussi appelée “classic delta”.

stylo(gui=FALSE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min = 100, mfw.max = 1000, mfw.incr=100,
      analysis.type = "BCT", consensus.strength = 0.5,  distance.measure = "delta",
      pca.visual.flavour = "classic")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
Calculating z-scores... 

Calculating classic Delta distances...
MFW used: 
100 
Processing metadata...


Assigning plot colors according to file names...

200 
Processing metadata...


Assigning plot colors according to file names...

300 
Processing metadata...


Assigning plot colors according to file names...

400 
Processing metadata...


Assigning plot colors according to file names...

500 
Processing metadata...


Assigning plot colors according to file names...

600 
Processing metadata...


Assigning plot colors according to file names...

700 
Processing metadata...


Assigning plot colors according to file names...

800 
Processing metadata...


Assigning plot colors according to file names...

900 
Processing metadata...


Assigning plot colors according to file names...

1000 
Processing metadata...


Assigning plot colors according to file names...

 

Comparez les résultats obtenus avec ces différentes méthode de calcul. Réflechissez à ce dilemme: la différence entre les résultats signifie-t-elle

  • que les résultats ne sont pas fiables?
  • que certains calculs de distance ne sont pas fiables?
  • ou bien que l’on ne peut rien déduire de ce corpus?

##2.5 S’appuyer sur d’autres expériences

En plus de cette approche empirique, il est important de s’appuyer sur des études qui précisent les paramètres les plus efficaces. Selon Evert, Proisl, Jannidi, Reger, Pielström, Schöch, Vitt (2017), 5000 mots MFW avec cosine delta serait le plus efficace (y compris pour le français):

100% center

100% center

Evert, Proisl, Jannidi, Reger, Pielström, Schöch, Vitt, " Understanding and explaining Delta measures for authorship attribution",Digital Scholarship in the Humanities, Volume 32, December 2017, Pages ii4–ii16, https://doi.org/10.1093/llc/fqx023

stylo(gui=FALSE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min =5000, mfw.max = 100, mfw.incr=100,
      analysis.type = "CA", distance.measure = "wurzburg",
      pca.visual.flavour = "classic")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
Calculating z-scores... 

MFW used: 
5000 
Processing metadata...


Assigning plot colors according to file names...

#3. Fonctionnement de stylo

Les données utilisées pendant l’analyse stylométrique sont accessibles: pour les voir, nous devons donc créer une variable et les stocker. Appelons la variable “resultats”, qui s’utilise ainsi:

resultats <- stylo(gui=FALSE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min = 5000, mfw.max = 100, mfw.incr=100,
      analysis.type = "CA", distance.measure = "wurzburg",
      pca.visual.flavour = "classic")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
Calculating z-scores... 

MFW used: 
5000 
Processing metadata...


Assigning plot colors according to file names...

Voyons ce que nous donne cette variable:

resultats

Function call:
stylo(gui = FALSE, corpus.dir = "corpus", corpus.format = "xml.drama",     corpus.lang = "French", analyzed.features = "w", mfw.min = 5000,     mfw.max = 100, mfw.incr = 100, analysis.type = "CA", distance.measure = "wurzburg",     pca.visual.flavour = "classic")

Depending on your chosen options, some results should have been written
into a few files; you should be able to find them in your current
(working) directory. Usually, these include a list of words/features
used to build a table of frequencies, the table itself, a file containing
recent configuration, etc.

Advanced users: you can pipe the results to a variable, e.g.:
     important.contribution = stylo()
this will create a class "important.contribution" containing some presumably
interesting stuff. The class created, you can type, e.g.:
     summary(important.contribution)
to see which variables are stored there and how to use them.


for suggestions how to cite this software, type: citation("stylo")

Les données sont nombreuses: on nous redirige vers une sorte de portail avec les différentes données collectées, que l’on peut consulter avec le code suivant:

summary(resultats)

Function call:
stylo(gui = FALSE, corpus.dir = "corpus", corpus.format = "xml.drama",      corpus.lang = "French", analyzed.features = "w", mfw.min = 5000,      mfw.max = 100, mfw.incr = 100, analysis.type = "CA", distance.measure = "wurzburg",      pca.visual.flavour = "classic") 

Available variables:

           distance.table  final distances between each pair of samples
                 features  features (e.g. words, n-grams, ...) applied to data
   features.actually.used  features (e.g. frequent words) actually analyzed
    frequencies.0.culling  frequencies of words/features accross the corpus
            list.of.edges  edges of a network of stylometric similarities
     table.with.all.freqs  frequencies of words/features accross the corpus
   table.with.all.zscores  z-scored frequencies accross the corpus

These variables can be accessed by typing e.g.:

 resultats$distance.table 

Plusieurs variables sont diponibles. features permet d’afficher la liste des mots par ordre de fréquence:

resultats$features

---------------------------------------------------
features (e.g. words, n-grams, ...) applied to data 
---------------------------------------------------

  [1]  de            et            que           le            vous          je            
  [7]  l             la            à            un            il            en            
 [13]  est           d             qu            ce            ne            qui           
 [19]  les           pour          mon           me            n             si            
 [25]  des           on            a             j             m             son           
 [31]  plus          mais          ma            une           pas           du            
 [37]  votre         elle          dans          par           bien          moi           
 [43]  sa            nous          au            s             tout          lui           
 [49]  sans          fait          se            ai            tu            point         
 [55]  c             mes           cette         ses           vos           amour         
 [61]  même         peut          sur           où           coeur         ou            
 [67]  ces           avec          tous          être         faire         scène        
 [73]  comme         trop          faut          roi           t             voir          
 [79]  aux           dont          y             leur          rien          sont          
 [85]  suis          yeux          te            ont           âme          non           
 [91]  tant          ton           ciel          ils           quand         enfin         
 [97]  père         grand         madame        don           cet           donc          
[103]  dieux         nos           quoi          autre         moins         peu           
[109]  quelque       jamais        quel          ô            ta            mort          
[115]  veux          ici           honneur       deux          puis          sang          
[121]  notre         contre        avoir         jour          vois          esprit        
[127]  soit          mal           toi           sort          toujours      dit           
[133]  temps         aussi         doit          après        ainsi         seigneur      
[139]  encore        gloire        veut          avez          aime          prince        
[145]  toute         dire          là           main          peine         assez         
[151]  leurs         fois          fort          va            seul          tes           
[157]  oui           vie           donne         fille         encor         fils          
[163]  sais          sous          était        ni            nom           bras          
[169]  mieux         crime         dessein       fais          vient         reine         
[175]  raison        état         vu            déjà        dois          dieu          
[181]  homme         pouvoir       frère        ah            ha            fut           
[187]  amant         hélas        quelle        rendre        première     discours      
[193]  lieu          donner        voeux         aujourd       hui           foi           
[199]  mains         juste         malheur       beau          ait           dis           
[205]  heureux       autres        lieux         jusqu         vertu         pu            
[211]  voit          crois         monsieur      celui         chez          fortune       
[217]  grâce        jours         entre         puisque       flamme        coup          
[223]  viens         bon           avait         haine         parler        autant        
[229]  eux           mourir        trouve        doux          espoir        doute         
[235]  courage       devoir        douleur       grands        belle         prendre       
[241]  chose         moment        porte         êtes         phèdre       pleurs        
[247]  toutes        devant        objet         tel           vais          cour          
[253]  faites        sujet         force         parle         rois          effet         
[259]  vrai          acte          courroux      mille         car           maître       
[265]  soins         reste         bonheur       loin          eût          terre         
[271]  part          seulement     allons        depuis        pourquoi      malheureux    
[277]  puisse        monde         soin          laisse        peuple        sera          
[283]  trône        cher          femme         sait          colère       as            
[289]  bruit         digne         hippolyte     croire        seule         v             
[295]  voulez        ardeur        extrême      maux          cela          coups         
[301]  vers          voix          font          nuit          secret        faveur        
[307]  fureur        plutôt       pris          repos         allez         mère         
[313]  vain          ceux          corps         ii            mérite       triste        
[319]  avant         époux        feu           peur          puisqu        ayant         
[325]  cependant     hé           lois          sens          demande       destin        
[331]  trouver       ennemis       iii           soeur         voyez         victoire      
[337]  place         rend          traître      fit           malgré       souffrir      
[343]  funeste       bientôt      hymen         lorsque       tête         coupable      
[349]  iv            ose           semble        premier       celle         cruel         
[355]  prix          gens          aimer         dessus        éclat        oeil          
[361]  secours       trépas       donné        venger        alors         heure         
[367]  perte         joie          serait        voilà        mettre        respect       
[373]  quelques      rang          haut          longtemps     ennemi        perdre        
[379]  choix         empire        généreux    cent          personne      rodrigue      
[385]  ami           chercher      honte         paraître     vainqueur     esther        
[391]  été         fin           bas           beaucoup      loi           aurait        
[397]  servir        horreur       nature        puissance     sire          amitié       
[403]  grande        voici         beauté       feux          savoir        souvent       
[409]  envie         sein          afin          aller         aura          combat        
[415]  justice       plaisir       pouvez        venir         bonne         fasse         
[421]  sanche        suivre        théâtre     vengeance     avais         droit         
[427]  fidèle       ordre         bouche        comment       craindre      voulu         
[433]  crainte       dedans        malheurs      pitié        mis           partout       
[439]  chimène      crains        larmes        thésée      vouloir       armes         
[445]  désirs       visage        voyant        zèle         comte         intérêt     
[451]  vue           choses        couronne      effort        estime        garde         
[457]  hommes        rigueur       valeur        croit         monstre       offense       
[463]  silence       cieux         cours         dites         passion       princesse     
[469]  sortir        trouble       vivre         adieu         glorieux      mot           
[475]  sauver        aurais        laissez       pays          telle         jeune         
[481]  besoin        coeurs        lâche        montrer       quels         sentiments    
[487]  illustre      esprits       étant        palais        sceptre       toutefois     
[493]  appas         arcas         front         jaloux        racine        amis          
[499]  maîtresse    paix          sorte         avis          cause         imprimer      
[505]  infante       pourrait      rival         su            chacun        entendre      
[511]  savez         alcandre      amoureux      cacher        mépris       orgueil       
[517]  dès          noble         étais        fera          grandeur      rome          
[523]  trois         biens         césar        chaque        conseil       plaît        
[529]  retour        soleil        attendre      dernier       fatal         fers          
[535]  parmi         tiens         univers       aucun         chère        combien       
[541]  eut           près         vit           perfide       punir         abord         
[547]  art           connaître    défendre     laisser       passe         sommes        
[553]  ans           charmes       désir        entends       nouveau       parlez        
[559]  sois          soupirs       cherche       innocence     prend         tient         
[565]  très         elles         gardes        humeur        léonore      lucipe        
[571]  mien          prends        succès       desseins      eu            maintenant    
[577]  connais       cru           indigne       orante        perdu         peux          
[583]  titus         traits        appelle       injuste       naissance     offre         
[589]  saurait       cesse         ingrat        maison        pieds         regret        
[595]  sujets        attends       comédie      croyez        épée        faible        
[601]  instant       juge          outrage       paris         permis        action        
[607]  étrange      propos        supplice      venez         air           cruelle       
[613]  jusques       pensée       tantôt       amants        demander      demeure       
[619]  constance     espère       fer           montre        pense         péril        
[625]  souffre       suit          affaire       ailleurs      auprès       aventure      
[631]  beaux         douleurs      met           nouvelle      plaire        régner       
[637]  soient        tragédie     ville         aimable       aurai         histoire      
[643]  milieu        penser        pourtant      privilège    propre        rage          
[649]  transports    auteur        excès        mémoire      quelqu        attend        
[655]  bons          es            faiblesse     lit           moindre       paraît       
[661]  plein         présent      vi            arrêt        écoute       héros        
[667]  i             liberté      peuvent       plaisirs      soi           audace        
[673]  efforts       espérance    mots          odieux        presse        regards       
[679]  service       tourment      vôtre        aimé         cache         oblige        
[685]  recevoir      règne        rendu         songe         violence      bonté        
[691]  chemin        douceur       innocent      légitime     parole        passer        
[697]  plaindre      port          porter        vérité      vertus        achille       
[703]  âge          avons         ensemble      espérer      pièce        sert          
[709]  songez        vis           antoine       clitophon     faux          guerre        
[715]  pourrais      remède       aussitôt     avecque       bout          obéir        
[721]  ôte          tomber        trouvé       verra         voudrais      andromède    
[727]  dernière     devez         louis         quitter       témoins      vaut          
[733]  aveugle       bérénice    cède         désespoir    fuite         manque        
[739]  mortel        parti         promis        rare          rends         souvenir      
[745]  suffit        adore         aimez         donnez        enfants       importe       
[751]  jason         mêmes        ombre         ôter         présence     soyez         
[757]  beautés      ferai         foudre        long          lorsqu        moyen         
[763]  perd          qualité      sage          tombeau       victime       apparence     
[769]  aricie        clarigène    conseils      côté        effroi        favorable     
[775]  fruit         juifs         médée       occasion      pedre         prison        
[781]  sensible      souffrez      tour          agir          craignez      effets        
[787]  exemple       misérable    or            tyran         affront       choeur        
[793]  craint        ennui         fou           mauvais       nombre        parce         
[799]  phinée       pourra        prêt         tôt          vaincre       conserver     
[805]  contraire     hôtel        livre         naître       pareil        prête        
[811]  suite         taire         tenir         vont          abandonne     barbare       
[817]  carlos        clindor       haïr         importune     isabelle      japhet        
[823]  âmes         arrête       capable       chambre       demain        entretien     
[829]  erreur        lumière      pouvait       prompt        puissant      reçu         
[835]  regarde       secrets       adresse       aisément     davantage     faisant       
[841]  faute         forte         mari          ouvre         partir        prenez        
[847]  venu          amène        cris          esclave       faits         hercule       
[853]  hors          infidèle     mienne        périr        querelle      quoique       
[859]  sosie         soupçons     tirer         véritable    criminel      défense      
[865]  elvire        garder        haman         jette         juger         meure         
[871]  orage         ouvrage       sacrifice     tort          touche        tue           
[877]  armée        brute         famille       haute         lettre        majesté      
[883]  poison        quitte        sentiment     tendresse     apprendre     attraits      
[889]  danger        ferme         fût          genoux        infâme       monseigneur   
[895]  mortels       obstacle      presque       seront        tombe         alcmène      
[901]  bernard       certain       désormais    justes        messieurs     offrir        
[907]  ressentiment  trait         vii           actions       amphitryon    content       
[913]  douter        empêcher     entière      exploits      fameux        faveurs       
[919]  finir         menace        morts         obliger       oreille       quatre        
[925]  raisons       rendez        résoudre     serais        souci         surtout       
[931]  accord        autel         écouter      faisons       jalousie      mérité      
[937]  obéissance   oenone        perds         vaine         appui         brave         
[943]  lors          mer           monarque      passions      satisfait     arrive        
[949]  autrefois     bontés       connaît      destinée     fâcheux      fatale        
[955]  hyménée     mériter      passé        peines        prie          refuse        
[961]  rompre        serez         soldats       témoin       voyons        autorité     
[967]  certes        change        dirai         disgrâce     fus           iphigénie    
[973]  jupiter       ouvrir        petit         pleine        six           temple        
[979]  tristes       tristesse     usage         affreux       attente       bois          
[985]  cavalier      créuse       dû           enfers        ennuis        étaient      
[991]  états        feinte        heur          pied          plainte       soir          
[997]  approche      arrêter      justement     marine        

(total number of elements:  5000)

Ces mots sont classés du plus au moins fréquent dans le corpus. Nous pouvons voir leur fréquence par texte avec la variable table.with.all.freqs

resultats$table.with.all.freqs

------------------------------------------------
frequencies of words/features accross the corpus 
------------------------------------------------

                           de        et        que       le        vous      je        l        
CORNEILLEP_ANDROMEDE       3.3951384 2.8881046 1.8740369 1.6851419 1.7497639 1.0488641 1.6553164
CORNEILLEP_CID             3.1328205 2.7110946 1.7286125 1.7795903 0.8805265 1.5617759 1.8166651
CORNEILLEP_ILLUSIONCOMIQUE 3.3480808 2.5887839 1.7577424 1.5006577 1.745785  1.9191678 1.4767428
CORNEILLEP_MEDEE           3.602332  3.0193311 1.9515189 1.2887389 1.0923596 1.5526235 1.5219392
DURYER_CLARIGENE           2.470869  2.5831812 2.470869  1.8180542 2.0847957 1.965464  1.6706444
DURYER_CLITOPHON           3.3655844 2.3683742 2.3505669 1.7213747 0.9259809 1.5967235 1.8222829
DURYER_DYNAMIS             2.5321281 3.2563712 2.2326291 2.0638205 1.6663036 1.7370943 1.7262034
DURYER_ESTHER              2.9122765 2.5985557 2.0894992 2.3262697 1.8290517 1.586362  1.562685 
MOLIERE_AMPHITRYON         3.3137427 2.7197699 2.050769  1.4442916 1.5068151 2.1758159 1.4317869
MOLIERE_DOMGARCIEDENAVARRE 3.0433769 2.5303172 2.2854478 1.329291  2.1513526 1.6791045 1.5625   
                           ...       ...       ...       ...       ...       ...       ...      
                           la        à         un        il           
CORNEILLEP_ANDROMEDE       1.5658398 1.8292986 1.307352  1.3272357 ...
CORNEILLEP_CID             1.3207897 1.8954491 1.3995736 1.3485958 ...
CORNEILLEP_ILLUSIONCOMIQUE 1.2914026 1.4707641 1.53653   1.6321894 ...
CORNEILLEP_MEDEE           1.5771709 2.1172139 1.3930654 1.1660018 ...
DURYER_CLARIGENE           1.2003369 1.2564931 1.7759371 1.488137  ...
DURYER_CLITOPHON           1.5848519 1.317742  1.478008  1.0268891 ...
DURYER_DYNAMIS             1.8296667 1.3232411 1.8351122 1.6118493 ...
DURYER_ESTHER              1.5330887 1.3318338 1.7698591 1.4561383 ...
MOLIERE_AMPHITRYON         1.0941603 1.6631237 1.3942729 1.3817682 ...
MOLIERE_DOMGARCIEDENAVARRE 0.9736474 1.8948228 1.7257463 1.4109142 ...
                           ...       ...       ...       ...       ...

(total number of rows/columns:  28/5000)

On peut voir ces scores z-transformés avec $table.with.all.zscores

resultats$table.with.all.zscores

---------------------------------------
z-scored frequencies accross the corpus 
---------------------------------------

                           de         et         que        le         vous       je        
CORNEILLEP_ANDROMEDE       0.6842816  0.472655   -0.2652929 -0.4254443 -0.031686  -1.4494191
CORNEILLEP_CID             -0.0100579 -0.0027929 -0.6987936 -0.1466652 -1.3067341 -0.4017725
CORNEILLEP_ILLUSIONCOMIQUE 0.559723   -0.3313188 -0.6119591 -0.9699783 -0.0375225 0.3282174 
CORNEILLEP_MEDEE           1.2327103  0.8251286  -0.0343241 -1.5954895 -0.9960049 -0.4204667
DURYER_CLARIGENE           -1.7622027 -0.3463675 1.513825   -0.0331331 0.4597582  0.4227796 
DURYER_CLITOPHON           0.6060539  -0.9233382 1.1552121  -0.3184976 -1.2400589 -0.3303904
DURYER_DYNAMIS             -1.6000537 1.461817   0.8036471  0.6922844  -0.1541104 -0.0436763
DURYER_ESTHER              -0.5938241 -0.3050718 0.3769864  1.4669438  0.084618   -0.3515541
MOLIERE_AMPHITRYON         0.468832   0.0205089  0.2615342  -1.1363515 -0.3880575 0.8524335 
MOLIERE_DOMGARCIEDENAVARRE -0.2468096 -0.4883602 0.9610963  -1.4757935 0.5573877  -0.1621233
                           ...        ...        ...        ...        ...        ...       
                           l          la         à          un         il            
CORNEILLEP_ANDROMEDE       0.0592382  -0.0339873 1.015182   -0.4852049 -0.1214816 ...
CORNEILLEP_CID             0.9072204  -0.7548753 1.2611529  -0.0633864 -0.0176195 ...
CORNEILLEP_ILLUSIONCOMIQUE -0.8792708 -0.8413261 -0.317976  0.5630468  1.3613342  ...
CORNEILLEP_MEDEE           -0.641737  -0.0006535 2.0857528  -0.0931551 -0.9054696 ...
DURYER_CLARIGENE           0.1397958  -1.1092229 -1.1147115 1.6580865  0.6608897  ...
DURYER_CLITOPHON           0.9367451  0.0219424  -0.8869661 0.2953693  -1.5818956 ...
DURYER_DYNAMIS             0.4317912  0.7421382  -0.8665185 1.9287511  1.2624317  ...
DURYER_ESTHER              -0.4275942 -0.1303346 -0.834568  1.630286   0.5052981  ...
MOLIERE_AMPHITRYON         -1.1155403 -1.4215731 0.3972849  -0.087632  0.1436787  ...
MOLIERE_DOMGARCIEDENAVARRE -0.4285664 -1.7760978 1.258824   1.4285154  0.2853992  ...
                           ...        ...        ...        ...        ...        ...

(total number of rows/columns:  28/5000)

Ces résultats permettent d’évaluer la distance entre chacun des textes de notre corpus. Cette fois les résultats sont accessibles avec le nom de notre variable suivi de $distance.table

resultats$distance.table 

--------------------------------------------
final distances between each pair of samples 
--------------------------------------------

                           CORNEILLEP_ANDROMEDE CORNEILLEP_CID CORNEILLEP_ILLUSIONCOMIQUE
CORNEILLEP_ANDROMEDE       0                    1.0009417      0.9943957                 
CORNEILLEP_CID             1.0009417            0              0.9711001                 
CORNEILLEP_ILLUSIONCOMIQUE 0.9943957            0.9711001      0                         
CORNEILLEP_MEDEE           0.9916627            0.9460653      0.9472041                 
DURYER_CLARIGENE           1.0603433            1.0389668      1.0658526                 
DURYER_CLITOPHON           1.0171782            1.057457       1.0131517                 
DURYER_DYNAMIS             1.0533041            1.0179688      1.060149                  
DURYER_ESTHER              1.0369347            1.0302385      1.0973139                 
MOLIERE_AMPHITRYON         1.05929              1.073594       1.013192                  
MOLIERE_DOMGARCIEDENAVARRE 1.0073869            1.0103043      1.0501424                 
                           ...                  ...            ...                       
                           CORNEILLEP_MEDEE DURYER_CLARIGENE DURYER_CLITOPHON DURYER_DYNAMIS
CORNEILLEP_ANDROMEDE       0.9916627        1.0603433        1.0171782        1.0533041     
CORNEILLEP_CID             0.9460653        1.0389668        1.057457         1.0179688     
CORNEILLEP_ILLUSIONCOMIQUE 0.9472041        1.0658526        1.0131517        1.060149      
CORNEILLEP_MEDEE           0                1.0380353        1.0169681        1.0561129     
DURYER_CLARIGENE           1.0380353        0                0.8605236        0.9177383     
DURYER_CLITOPHON           1.0169681        0.8605236        0                0.9836259     
DURYER_DYNAMIS             1.0561129        0.9177383        0.9836259        0             
DURYER_ESTHER              1.0064069        0.9301051        0.9741543        0.8451089     
MOLIERE_AMPHITRYON         1.0647345        1.0717888        1.0964716        1.0807069     
MOLIERE_DOMGARCIEDENAVARRE 1.0141992        1.0344084        1.0954863        1.0027317     
                           ...              ...              ...              ...           
                           DURYER_ESTHER MOLIERE_AMPHITRYON MOLIERE_DOMGARCIEDENAVARRE
CORNEILLEP_ANDROMEDE       1.0369347     1.05929            1.0073869                 
CORNEILLEP_CID             1.0302385     1.073594           1.0103043                 
CORNEILLEP_ILLUSIONCOMIQUE 1.0973139     1.013192           1.0501424                 
CORNEILLEP_MEDEE           1.0064069     1.0647345          1.0141992                 
DURYER_CLARIGENE           0.9301051     1.0717888          1.0344084                 
DURYER_CLITOPHON           0.9741543     1.0964716          1.0954863                 
DURYER_DYNAMIS             0.8451089     1.0807069          1.0027317                 
DURYER_ESTHER              0             1.1242496          1.0192903                 
MOLIERE_AMPHITRYON         1.1242496     0                  0.9480107                 
MOLIERE_DOMGARCIEDENAVARRE 1.0192903     0.9480107          0                         
                           ...           ...                ...                       
                           MOLIERE_MISANTHROPE    
CORNEILLEP_ANDROMEDE       1.0644665           ...
CORNEILLEP_CID             1.0967865           ...
CORNEILLEP_ILLUSIONCOMIQUE 1.0286613           ...
CORNEILLEP_MEDEE           1.0892613           ...
DURYER_CLARIGENE           1.0723518           ...
DURYER_CLITOPHON           1.1228778           ...
DURYER_DYNAMIS             1.0995535           ...
DURYER_ESTHER              1.0901811           ...
MOLIERE_AMPHITRYON         0.8437953           ...
MOLIERE_DOMGARCIEDENAVARRE 0.8770485           ...
                           ...                 ...

(total number of rows/columns:  28/28)

C’est donc à partir de ces fréquences, puis de ces distances que nous obtenons les dendogrammes que nous avons vus précédemment.

#4. D’autres visualisations

##4.1 Principal component analysis

Un autre mode de visualisation est le principal component analysis (“Analyse en composantes principales” en français), qui permet lui aussi de spatialiser les résultats, selon une autre éthode de calcul.

###4.1.1 Principal component analysis classique

stylo(gui=FALSE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min = 5000, mfw.max = 100, mfw.incr=100,
      analysis.type = "PCV",  distance.measure = "wurzburg",
      pca.visual.flavour = "classic")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
MFW used: 
5000 
Processing metadata...


Assigning plot colors according to file names...

###4.1.2 Principal component analysis (avec les mots en superposition)

Il est possible de superposer les tokens (ici les mots) aux labels, afin de comprendre sur quelles données lexicales s’appuie la spatialisation.

stylo(gui=FALSE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min = 5000, mfw.max = 100, mfw.incr=100,
      analysis.type = "PCV",  distance.measure = "wurzburg",
      pca.visual.flavour = "loadings")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
MFW used: 
5000 
Processing metadata...


Assigning plot colors according to file names...

On le voit, la plupart des tokens ayant des fréquences très faible, on se retrouve avec un “tas” de mots au centre, ce qui rend les données illisibles… Comment faire?

  • Aller chercher les données brutes, mais on perd l’avantage de la visualisation.
  • Tenter “d’étirer” la partie centrale.

###4.1.3 Principal component analysis: les classes

Nous avons vu au cours précédent qu’il est important de contrôler la significativité des axes produits: nous ne pouvons cependant pas le faire avec stylo(), et il faut se tourner vers un autre pasckage: FactoMineR.

La première étape est de récupérer les fréquences qui nous intéressent pour les réutiliser plus tard:

#Je prends les fréquences par texte produites par stylo
resultats$table.with.all.freqs

------------------------------------------------
frequencies of words/features accross the corpus 
------------------------------------------------

                           de        et        que       le        vous      je        l        
CORNEILLEP_ANDROMEDE       3.3951384 2.8881046 1.8740369 1.6851419 1.7497639 1.0488641 1.6553164
CORNEILLEP_CID             3.1328205 2.7110946 1.7286125 1.7795903 0.8805265 1.5617759 1.8166651
CORNEILLEP_ILLUSIONCOMIQUE 3.3480808 2.5887839 1.7577424 1.5006577 1.745785  1.9191678 1.4767428
CORNEILLEP_MEDEE           3.602332  3.0193311 1.9515189 1.2887389 1.0923596 1.5526235 1.5219392
DURYER_CLARIGENE           2.470869  2.5831812 2.470869  1.8180542 2.0847957 1.965464  1.6706444
DURYER_CLITOPHON           3.3655844 2.3683742 2.3505669 1.7213747 0.9259809 1.5967235 1.8222829
DURYER_DYNAMIS             2.5321281 3.2563712 2.2326291 2.0638205 1.6663036 1.7370943 1.7262034
DURYER_ESTHER              2.9122765 2.5985557 2.0894992 2.3262697 1.8290517 1.586362  1.562685 
MOLIERE_AMPHITRYON         3.3137427 2.7197699 2.050769  1.4442916 1.5068151 2.1758159 1.4317869
MOLIERE_DOMGARCIEDENAVARRE 3.0433769 2.5303172 2.2854478 1.329291  2.1513526 1.6791045 1.5625   
                           ...       ...       ...       ...       ...       ...       ...      
                           la        à         un        il           
CORNEILLEP_ANDROMEDE       1.5658398 1.8292986 1.307352  1.3272357 ...
CORNEILLEP_CID             1.3207897 1.8954491 1.3995736 1.3485958 ...
CORNEILLEP_ILLUSIONCOMIQUE 1.2914026 1.4707641 1.53653   1.6321894 ...
CORNEILLEP_MEDEE           1.5771709 2.1172139 1.3930654 1.1660018 ...
DURYER_CLARIGENE           1.2003369 1.2564931 1.7759371 1.488137  ...
DURYER_CLITOPHON           1.5848519 1.317742  1.478008  1.0268891 ...
DURYER_DYNAMIS             1.8296667 1.3232411 1.8351122 1.6118493 ...
DURYER_ESTHER              1.5330887 1.3318338 1.7698591 1.4561383 ...
MOLIERE_AMPHITRYON         1.0941603 1.6631237 1.3942729 1.3817682 ...
MOLIERE_DOMGARCIEDENAVARRE 0.9736474 1.8948228 1.7257463 1.4109142 ...
                           ...       ...       ...       ...       ...

(total number of rows/columns:  28/5000)
# je retourne le tableau pour avoir un mot par rang
theatreFrequences<-t(resultats$table.with.all.freqs)
# je ne garde que les 100 premiers mots
head(theatreFrequences[1:100,])
     CORNEILLEP_ANDROMEDE CORNEILLEP_CID CORNEILLEP_ILLUSIONCOMIQUE CORNEILLEP_MEDEE DURYER_CLARIGENE
de               3.395138      3.1328205                   3.348081         3.602332         2.470869
et               2.888105      2.7110946                   2.588784         3.019331         2.583181
que              1.874037      1.7286125                   1.757742         1.951519         2.470869
le               1.685142      1.7795903                   1.500658         1.288739         1.818054
vous             1.749764      0.8805265                   1.745785         1.092360         2.084796
je               1.048864      1.5617759                   1.919168         1.552624         1.965464
     DURYER_CLITOPHON DURYER_DYNAMIS DURYER_ESTHER MOLIERE_AMPHITRYON MOLIERE_DOMGARCIEDENAVARRE
de          3.3655844       2.532128      2.912277           3.313743                   3.043377
et          2.3683742       3.256371      2.598556           2.719770                   2.530317
que         2.3505669       2.232629      2.089499           2.050769                   2.285448
le          1.7213747       2.063821      2.326270           1.444292                   1.329291
vous        0.9259809       1.666304      1.829052           1.506815                   2.151353
je          1.5967235       1.737094      1.586362           2.175816                   1.679104
     MOLIERE_MISANTHROPE MOLIERE_TARTUFFE RACINE_BERENICE RACINE_ESTHER RACINE_IPHIGENIE
de              3.262026         3.138635        3.333333     3.5413770         3.003790
et              3.086420         3.185550        1.983365     2.4657935         2.479938
que             2.059387         1.914145        2.188100     1.4414283         1.983950
le              1.580460         1.505982        1.682662     2.4950611         1.688587
vous            3.091741         3.133943        2.616763     0.9877808         2.574677
je              2.261601         1.904762        2.603967     0.9072949         1.816763
     RACINE_PHEDRE ROTROU_COSROES ROTROU_DEUXPUCELLES ROTROU_DOMBERNARDDECABRERE
de       4.0640927       3.169511            3.180893                   3.468175
et       2.1786202       3.336327            2.817677                   3.245343
que      1.2325527       1.315283            2.080238                   1.514113
le       1.9787468       2.033877            1.408838                   2.022626
vous     0.9960358       2.572822            1.293269                   1.496972
je       1.1459409       1.385859            1.766551                   1.091304
     ROTROU_HERCULEMOURANT SCARRON_DOMJAPHETDARMENIE SCARRON_ECOLIERDESALAMANQUE
de               3.2294961                  3.060230                    2.880212
et               3.2833210                  2.345527                    2.681369
que              1.7089417                  1.494380                    2.018559
le               1.7358541                  2.007667                    1.663051
vous             0.5315212                  2.033656                    2.368040
je               0.9688488                  2.429992                    2.500603
     SCARRON_FAUSSEAPPARENCE SCARRON_GARDIENDESOIMEME SCUDERY_MORTDECESAR SCUDERY_ORANTE
de                  2.762744                 2.741808            3.495815       2.281265
et                  2.441787                 2.261536            2.968277       2.322246
que                 2.108244                 1.866375            2.300063       2.233454
le                  1.422278                 2.249377            2.377435       2.144662
vous                2.234110                 1.969725            1.266090       1.502630
je                  2.353682                 2.504712            1.259056       2.076361
     SCUDERY_PRINCEDEGUISE SCUDERY_VASSALGENEREUX
de                3.284882               2.810734
et                3.092784               2.500000
que               2.298777               2.415254
le                1.991420               2.274011
vous              1.120574               2.175141
je                1.805725               1.631356
#Je peux évidemment tout faire d'un coup:
#theatreFrequences<-t(resultats$table.with.all.freqs)[1:100,]

Je peux désormais contrôler la significativité des axes produits:

if(!require("FactoMineR")){
  install.packages("FactoMineR")
  library(FactoMineR)
}
Loading required package: FactoMineR
theatreFrequencesPCA = PCA(t(theatreFrequences))

barplot(theatreFrequencesPCA$eig[,1], main="Eigenvalues", names.arg=1:nrow(theatreFrequencesPCA$eig))

Mais nous allons un peu vite: ralentissons un peu, nous reviendrons à ces questions le cours prochain.

##4.2 Principal component analysis (avec correlation)

Il est possible de modifier les résultats afin d’accentuer de manière proportionnelle la distance entre les différents tokens pour “aérer” la partie centrale en modifiant légèrement la méthode de calcul.

stylo(gui=FALSE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min = 100, mfw.max = 100, mfw.incr=100,
      analysis.type = "PCR",  distance.measure = "delta",
      pca.visual.flavour = "loadings")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
MFW used: 
100 
Processing metadata...


Assigning plot colors according to file names...

Il est ainsi possible d’associer certains tokens à des auteurs, ou des groupes d’auteurs.

En bas du graphique, on trouve un pourcentage: il nous donne une idée de la distortion apportée au résultat précédent pour accentuer l’espace entre les mots, et donc le degré de fiabilité du résultat. On remarque la correlation a fait perdre de la significativité au premier axe.

##4.3 Multidimensional scaling

Un mode de visualisation des données assez commun est le Multidimensional scaling (“positionnement multidimensionnel” en français). Pour faire (très, très) simple, il s’agit de spatialiser les résultats.

stylo(gui=FALSE, corpus.dir = "corpus",
      corpus.format = "xml.drama", corpus.lang = "French",
      analyzed.features = "w", mfw.min = 100, mfw.max = 100, mfw.incr=100,
      analysis.type = "MDS",  distance.measure = "wurzburg",
      pca.visual.flavour = "classic")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
Calculating z-scores... 

MFW used: 
100 
Processing metadata...


Assigning plot colors according to file names...

Un des intérêts de ce type de visualisation est d’identifier les auteurs avec les styles les plus neutres, et ceux avec les styles les plus marqués.

#Conclusion: vers l’analyse de réseau

if(!require("networkD3")){
  install.packages("networkD3")
  library("networkD3")
}
Loading required package: networkD3
stylo.network(gui=FALSE, corpus.dir = "corpus",
              corpus.format = "xml.drama", corpus.lang = "French",
              analyzed.features = "w", mfw.min = 1700, mfw.max = 100, mfw.incr=100,
              analysis.type = "CA", distance.measure = "wurzburg",
              pca.visual.flavour = "classic")
using current directory...
Performing no sampling (using entire text as sample)

loading CORNEILLEP_ANDROMEDE.xml    ...
loading CORNEILLEP_CID.xml  ...
loading CORNEILLEP_ILLUSIONCOMIQUE.xml  ...
loading CORNEILLEP_MEDEE.xml    ...
loading DURYER_CLARIGENE.xml    ...
loading DURYER_CLITOPHON.xml    ...
loading DURYER_DYNAMIS.xml  ...
loading DURYER_ESTHER.xml   ...
loading MOLIERE_AMPHITRYON.xml  ...
loading MOLIERE_DOMGARCIEDENAVARRE.xml  ...
loading MOLIERE_MISANTHROPE.xml ...
loading MOLIERE_TARTUFFE.xml    ...
loading RACINE_BERENICE.xml ...
loading RACINE_ESTHER.xml   ...
loading RACINE_IPHIGENIE.xml    ...
loading RACINE_PHEDRE.xml   ...
loading ROTROU_COSROES.xml  ...
loading ROTROU_DEUXPUCELLES.xml ...
loading ROTROU_DOMBERNARDDECABRERE.xml  ...
loading ROTROU_HERCULEMOURANT.xml   ...
loading SCARRON_DOMJAPHETDARMENIE.xml   ...
loading SCARRON_ECOLIERDESALAMANQUE.xml ...
loading SCARRON_FAUSSEAPPARENCE.xml ...
loading SCARRON_GARDIENDESOIMEME.xml    ...
loading SCUDERY_MORTDECESAR.xml ...
loading SCUDERY_ORANTE.xml  ...
loading SCUDERY_PRINCEDEGUISE.xml   ...
loading SCUDERY_VASSALGENEREUX.xml  ...
slicing input text into tokens...


turning words into features, e.g. char n-grams (if applicable)...

Total nr. of samples in the corpus: 28
.........................
...
The corpus consists of 480663 tokens

processing  28  text samples
..       
combining frequencies into a table...


culling @ 0 available features (words) 5000
Calculating z-scores... 

MFW used: 
1700 
Processing metadata...


Assigning plot colors according to file names...

 


SORRY, BUT YOU ARE EXPECTING TOO MUCH...!
There should be at least 3 iterations to make a consensus tree
LS0tCnRpdGxlOiAiQ291cnNfR2VuZXZlXzUiCmF1dGhvcjogIlNpbW9uIEdhYmF5IgpkYXRlOiAiMTcvMDMvMjAyMCIKb3V0cHV0OgogIGlvc2xpZGVzX3ByZXNlbnRhdGlvbjogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBiZWFtZXJfcHJlc2VudGF0aW9uOiBkZWZhdWx0CiAgc2xpZHlfcHJlc2VudGF0aW9uOiBkZWZhdWx0Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpJbCBleGlzdGUgZGUgbXVsdGlwbGVzIG9wdGlvbnMgaW5mb3JtYXRpcXVlcyBwb3VyIGZhaXJlIGRlIGxhIHN0eWxvbcOpdHJpZS4gTm91cyBub3VzIHByb3Bvc29ucywgZGFucyBjZSBjb3VycywgZCd1dGlsaXNlciBsZSBwYWNrYWdlIGBSYCBub21tw6kgICpTdHlsbyosIG1haXMgZCdhdXRyZXMgb3B0aW9ucyBleGlzdGVudCBjb21tZSBbRmFjdG9NaW5lUl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL0ZhY3RvTWluZVIvaW5kZXguaHRtbCkuIENlIHBhY2thZ2Ugw6l0YW50IGTDqXZlbG9wcMOpIHBhciBkZXMgZnJhbsOnYWlzIGRlIGwnYWdyb2NhbXB1cyBkZSBSZW5uZXMsIG5vdG9ucyBxdSd1bmUgW2ltcG9ydGFudGUgZG9jdW1lbnRhdGlvbiBlbiBmcmFuw6dhaXNdKGh0dHA6Ly9mYWN0b21pbmVyLmZyZWUuZnIvaW5kZXhfZnIuaHRtbCkgZXN0IGRpc3BvbmlibGUsIGV0IHBlcm1ldHRyYSBhdXggcGVyc29ubmVzIGludMOpcmVzc8OpZXMgZGUgY29udGludWVyIGxldXIgYXBwcmVudGlzc2FnZSBkZSBsYSBzdHlsb23DqXRyaWUuCgpDZSBjb3VycyBlc3QgZGlzcG9uaWJsZSBlbiBsaWduZSBhdmVjIGxlIGNvcnB1cyBxdWUgbm91cyB1dGlsaXNvbnMgZGFucyBjZSBub3RlYm9vazogb24gcGV1dCBsZSB0cm91dmVyIHN1ciBub3RyZSBbR2l0aHViXShodHRwczovL2dpdGh1Yi5jb20vZ2FiYXlzKS4gSWwgZXN0IGRpc3RyaWJ1w6kgYXZlYyB1bmUgbGljZW5jZSBbQ0MtQlldKGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjAvZnIpLgoKTGUgY29ycHVzIGVzdCBjb25zdGl0dcOpIGRlIHBpw6hjZXMgZGUgdGjDqcOidHJlIGR1IFhWSUllIHNpw6hjbGUsIGRpc3BvbmlibGVzIHN1ciBsZSBzaXRlIFt3d3cudGhlYXRyZS1jbGFzc2lxdWUuZnJdKHd3dy50aGVhdHJlLWNsYXNzaXF1ZS5mciksIHJhc3NlbWJsw6llcyBwYXIgSi4tQi4gQ2FtcHMgKEVjb2xlIGRlcyBDaGFydGVzKSBldCBhZGFwdMOpZXMgcGFyIG5vdXMtbcOqbWVzIHBvdXIgY29ycmVzcG9uZHJlIGF1eCBiZXNvaW5zIGRlIGNlIGNvdXJzLgoKIyAxLiBRdWVscXVlcyByZW1hcnF1ZXMgYXZhbnQgZGUgY29tbWVuY2VyCgojIyAxLjEgRGVzIHJlc3NvdXJjZXMgZW4gbGlnbmUKCmBTdHlsb2AgZXN0IGTDqXZlbG9wcMOpIHBhciBNYWNpZWogRWRlciAoQ3Jhdm9jaWUpLCBNaWtlIEtlc3Rtb250IChBbnZlcnMpIGV0IEphbiBSeWJpY2tpIChDcmF2b2NpZSkuIE9uIHRyb3V2ZXJhIGRlIG5vbWJyZXVzZXMgcmVzc291cmNlcyBzdXIgbGUgc2l0ZSBkZSBsZXVyIGdyb3VwZSBkZSBbY29tcHV0YXRpb25hbCBzdHlsaXN0aWNzXShodHRwczovL2NvbXB1dGF0aW9uYWxzdHlsaXN0aWNzLmdpdGh1Yi5pbykgZXQgc3VyIGxldXIgW0dpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2NvbXB1dGF0aW9uYWxzdHlsaXN0aWNzKSwgcXVpIGNvbnRpZW50IHVuIFtyZXBvXShodHRwczovL2dpdGh1Yi5jb20vY29tcHV0YXRpb25hbHN0eWxpc3RpY3Mvc3R5bG8pIGNvbnNhY3LDqSBhdSBwYWNrYWdlIHN0eWxvIGF2ZWMgZGUgbm9tYnJldXNlcyBpbmZvcm1hdGlvbnMgc3VyIHNvbiBmb25jdGlvbm5lbWVudC4KClBvdXIgY2V1eCBxdWkgdm91ZHJhaWVudCBzJ2VudHJhw65uZXIgYXZlYyBkJ2F1dHJlcyBkb25uw6llcyBxdWUgY2VsbGVzIGZvdXJuaWVzIHBvdXIgbGUgY291cnMsIFt1biByZXBvIGF2ZWMgMTAwIHJvbWFucyBhbmdsYWlzIHNlIHRyb3V2ZSBzdXIgbGV1ciBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wdXRhdGlvbmFsc3R5bGlzdGljcy8xMDBfZW5nbGlzaF9ub3ZlbHMpIChjbGlxdWV6IHN1ciBsZSBib3V0b24gdmVydCBgQ2xvbmUgb3IgZG93bmxvYWQgw6AgZHJvaXRlYCBwb3VyIHTDqWzDqWNoYXJnZXIgbGUgdG91dCBhdSBmb3JtYXQgemlwKS4KCiMjMS4yIMOAIHByb3BvcyBkdSBjb3JwdXMKCmBTdHlsb2AgYSBiZXNvaW4gZGUgc2F2b2lyIG/DuSBjaGVyY2hlciBsZXMgZG9ubsOpZXMgKHBvdXIgbm91cyBpbCBzJ2FnaXQgZGUgbm90cmUgY29ycHVzKSBxdSdpbCB2YSB1dGlsaXNlciwgZXQgY2VsbGVzLWNpIGRvaXZlbnQgKippbXDDqXJhdGl2ZW1lbnQqKiBvYsOpaXIgw6AgdHJvaXMgcsOoZ2xlcyBzaW1wbGVzOgoKMS4gVG91cyBsZXMgdGV4dGVzIHF1aSBmb3JtZW50IG5vdHJlIGNvcnB1cyBkZSB0cmF2YWlsIGRvaXZlbnQgc2UgdHJvdXZlciBkYW5zIHVuIGRvc3NpZXIgaW50aXR1bMOpICpjb3JwdXMqLgoyLiBDZSBkb3NzaWVyIGBjb3JwdXNgIG5lIGRvaXQgY29udGVuaXIgcXVlIGxlcyBmaWNoaWVycyBkdSBjb3JwdXM6IHRvdXQgYXV0cmUgZG9jdW1lbnQgc2UgcmV0cm91dmVyYWl0IGFuYWx5c8OpIGF2ZWMgbGUgcmVzdGUsIGV0IHBlcnR1cmJlcmFpdCBsZXMgcsOpc3VsdGF0cy4KMy4gTGVzIGZpY2hpZXJzIGR1IGNvcnB1cyBkb2l2ZW50IHV0aWxpc2VyIHVuIG3Dqm1lIGZvcm1hdCwgc29pdCBlbiBgdHh0YCwgc29pdCBlbiBgWE1MYCwgc29pdCBlbiBgSFRNTGAuCgojIzEuNCBQcsOpcGFyZXIgbGEgc2Vzc2lvbiBkZSB0cmF2YWlsCgpOb3VzIGRldm9ucyBwcsOpcGFyZXIgbGEgc2Vzc2lvbiBkZSB0cmF2YWlsLCBlbiBkw6lzaWduYW50IMOgIGBSYCBsZSBmaWNoaWVyIGRlIG5vdHJlIG9yZGluYXRldXIgw6AgcGFydGlyIGR1cXVlbCBub3VzIGFsbG9ucyB0cmF2YWlsbGVyIHBvdXIgcXUnaWwgdHJvdXZlIG5vdHJlIGZpY2hpZXIgYGNvcnB1c2AsIGV0IHF1J2lsIHkgc2F1dmVnYXJkZSBub3MgcsOpc3VsdGF0cy4KClBvdXIgaW5kaXF1ZXIgb8O5IHNlIHRyb3V2ZSBsZSBmaWNoaWVyIGRlIHRyYXZhaWwsIGRldXggc29sdXRpb25zIHNvbnQgcG9zc2libGVzOgoKKiBvdSBiaWVuICp2aWEqIGxlIG1lbnUgYXZlYyBgU2Vzc2lvbj5TZXQgV29ya2luZyBEaXJlY3Rvcnk+Q2hvb3NlIERpcmVjdG9yeWAKKiBvdSBiaWVuIGRpcmVjdGVtZW50IGRhbnMgYFJgIGF2ZWMgbGEgY29tbWFuZGUgYHNldHdkYCAocG91ciAqU2V0IHdvcmtpbmcgZGlyZWN0b3J5KiksIHF1aSBzJ3V0aWxpc2UgZGUgY2V0dGUgbWFuacOocmUuCgpgYGB7cn0Kc2V0d2QoIn4vR2l0SHViL0NvdXJzXzIwMjBfVW5pR0UvQ291cnNfR2VuZXZlXzUiKQojamUgY2hhcmdlIGxlcyBkb25uw6llcyBxdWUgbCdlbnNlaWduYW50IGEgcHLDqXBhcsOpIHBvdXIgw6l2aXRlciBsZXMgcHJvYmzDqG1lcwojbG9hZCgiQ291cnNfR2VuZXZlXzUuUkRhdGEiKQpgYGAKCk9uIHBldXQgdsOpcmlmaWVyIHF1ZSBsZSBjaGVtaW4gdmVycyBsZSBkb3NzaWVyIGRlIHRyYXZhaWwgYSBiaWVuIMOpdMOpIHByaXMgZW4gY29tcHRlIGF2ZWMgdW5lIGF1dHJlIGNvbW1hbmRlOiBgZ2V0d2RgIChwb3VyICpHZXQgd29ya2luZyBkaXJlY3RvcnkqKToKCmBgYHtyfQpnZXR3ZCgpCmBgYAoKVG91dCBlc3QgZW4gb3JkcmU/IEF2YW7Dp29ucyEgaW5zdGFsbG9ucyBgc3R5bG8oKWAKCmBgYHtyfQppZighcmVxdWlyZSgic3R5bG8iKSl7CiAgaW5zdGFsbC5wYWNrYWdlcygic3R5bG8iKQogIGxpYnJhcnkoc3R5bG8pCn0KYGBgCgpJbCBuZSBub3VzIHJlc3RlIHBsdXMgcXUnw6AgbGFuY2VyIHN0eWxvLCBhdmVjIGxhIGNvbW1hbmRl4oCmIGBzdHlsbygpYCEKCiMyLiBMZSAqZGF0YSBjbHVzdGVyaW5nKgoKIyMyLjEgT3V2cmlyIGBzdHlsb2AKCkwnYXBwbGljYXRpb24gYFN0eWxvYCBwZXV0IMOqdHJlIHV0aWxpc8OpZSBlbiBsaWduZSBkZSBjb21tYW5kZSwgbWFpcyBhdXNzaSBhdmVjIHVuZSBHVUkgKCpncmFwaGljYWwgdXNlciBpbnRlcmZhY2UqLCBlbiBmcmFuw6dhaXMgImludGVyZmFjZSBncmFwaGlxdWUiKS4gU2kgdm91cyB2b3VsZXogYXZvaXIgdW4gcHJlbWllciBhcGVyw6d1LCByZXRpcmV6IGxlICMgYXUgZMOpYnV0IGRlIGxhIGxpZ25lICppbmZyYSogZXQgY2xpcXVleiBzdXIgYFJ1bmAuCgpgYGB7cn0KI3N0eWxvKCkKYGBgCgojIzIuMiBVbmUgcHJlbWnDqHJlIGFuYWx5c2UgZGUgY2x1c3RlcgoKTm91cyBhbGxvbnMgZMOpc29ybWFpcyB0ZW50ZXIgdW5lIHByZW1pw6hyZSBhbmFseXNlIGRlIGNsdXN0ZXIuIExlICpkYXRhIGNsdXN0ZXJpbmcqIChvdSAicGFydGl0aW9ubmVtZW50IGRlIGRvbm7DqWVzIiBlbiBmcmFuw6dhaXMpIGNoZXJjaGUgw6AgZGl2aXNlciB1biBlbnNlbWJsZSBkZSBkb25uw6llcyBlbiBkaWZmw6lyZW50cyAiZ3JvdXBlcyIgaG9tb2fDqG5lcyBzZWxvbiBkZXMgY2FyYWN0w6lyaXN0aXF1ZXMgcXUnaWxzIHBhcnRhZ2VudC4gQ2VzIGdyb3VwZXMgKGRhbnMgbm90cmUgY2FzIGRlcyBwacOoY2VzIGRlIHRow6nDonRyZSkgc29udCBmb3Jtw6lzIMOgIHBhcnRpciBkZSBjYWxjdWxzIHF1aSBkw6l0ZXJtaW5lbnQgbGV1ciBwcm94aW1pdMOpIChzaW1pbGFyaXTDqSBvdSBkaXN0YW5jZSkuCgoqKk5vdGUgaW1wb3J0YW50ZSoqIEFmaW4gZGUgZ2FnbmVyIGR1IHRlbXBzLCBub3VzIGF2b25zIGRpcmVjdGVtZW50IHBhcmFtw6l0csOpIGxlIGZvcm11bGFpcmUgZGUgbGEgR1VJLCBtYWlzIGxhIGNvbW1hbmRlIGBzdHlsbygpYCB2aWRlLCBjb21tZSBwcsOpY8OpZGVtbWVudCAoKmNmLiogMi4xKSwgc3VmZmlyYWl0IHNpIGxlcyBib25uZXMgY2FzZXMgw6l0YWllbnQgYmllbiBjb2Now6llcy4KCkxvcnNxdWUgdm91cyBhcHB1eWVyZXogc3VyIGBSdW5gIG9ic2VydmV6IGxhIGNvbnNvbGU6IHVuZSBzw6lyaWUgZGUgbWVzc2FnZXMgdm91cyBhdmVydGl0IGRlIGNlIHF1J2lsIHNlIHBhc3NlLgoKYGBge3J9CnN0eWxvKGd1aT1UUlVFLCBjb3JwdXMuZGlyID0gImNvcnB1cyIsCiAgICAgIGNvcnB1cy5mb3JtYXQgPSAieG1sLmRyYW1hIiwgY29ycHVzLmxhbmcgPSAiRnJlbmNoIiwKICAgICAgYW5hbHl6ZWQuZmVhdHVyZXMgPSAidyIsIG1mdy5taW4gPSAxMDAsIG1mdy5tYXggPSAxMDAsIG1mdy5pbmNyPTEwMCwKICAgICAgYW5hbHlzaXMudHlwZSA9ICJDQSIsIGRpc3RhbmNlLm1lYXN1cmUgPSAibWFuaGF0dGFuIiwKICAgICAgcGNhLnZpc3VhbC5mbGF2b3VyID0gImNsYXNzaWMiKQpgYGAKClJlcHJlbm9ucyBsZSBwcm9jZXNzdXMgZGFucyBzZXMgZ3JhbmRlcyBsaWduZXM6CgoxLiBgbG9hZGluZ+KApmA6IFVuZSBmb2lzIGxhIGNvbW1hbmRlIGxhbmPDqWUsIGNoYXF1ZSB0ZXh0ZSBlc3QgZXN0IGNoYXJnw6kuCjIuIGBUb3RhbCBuci4gb2Ygc2FtcGxlc+KApmA6IE9uIG5vdXMgYXZlcnRpdCBkdSBub21icmUgZGUgdGV4dGVzIGRhbnMgbGUgY29ycHVzLCBxdWkgc29udCB0b3VzIMOpY2xhdMOpcyBlbiAqdG9rZW5zKiAoaWNpIGRlcyBtb3RzKS4KMy4gYGNvbWJpbmluZyBmcmVxdWVuY2llc+KApmA6IExlIG5vbWJyZSBkJ29jY3VycmVuY2UgZGUgY2hhcXVlIHRva2VuIGVzdCBjYWxjdWzDqSBwb3VyIGNoYXF1ZSBkb2N1bWVudCBkdSBjb3JwdXMsIHBvdXIgZm9ybWVyIHVuIHRhYmxlYXUgZGUgZnLDqXF1ZW5jZXMuCjQuIGBDYWxjdWxhdGluZyBNYW5oYXR0YW4gZGlzdGFuY2VgOiBjZXMgdGFibGVhdXggZGUgZnLDqXF1ZW5jZXMgcGVybWV0dGVudCBkZSB2b2lyIHNpIGNlcnRhaW5zIHRva2VucyByZXZpZW5uZW50IGRlIG1hbmnDqHJlIMOpcXVpdmFsZW50ZSBkYW5zIGQnYXV0cmVzIGRvY3VtZW50cywgZXQgZGUgcHJvZHVpcmUgbGVzIGNsdXN0ZXJzLiBOb3VzIGFsbG9ucyByZXZlbmlyIHBsdXNpZXVycyBmb2lzIHN1ciBjZSBwb2ludCBwYXIgbGEgc3VpdGUuCgpSZWdhcmRvbnMgbWFpbnRlbmFudCBsZSBncmFwaGlxdWUgcXVpIG5vdXMgZXN0IGRvbm7DqS4gSWwgcydhZ2l0IGQndW4gZGVuZG9ncmFtbWUsIHF1aSBlc3QgYWNjb21wYWduw6kgZGUgcXVlbHF1ZXMgaW5mb3JtYXRpb25zIGVuIGJhcyBkZSBwYWdlIChgMTAwIE1GVyBDdWxsZWQgQCAwJSBNYW5oYXR0YW4gZGlzdGFuY2VgKToKCiogT24gcmVtYXJxdWUgbCd1dGlsaXNhdGlvbiBkZSBkaWZmw6lyZW50ZXMgY291bGV1cnM6IHRvdXMgbGVzIGxhYmVscyAobGVzIG5vbXMgZGVzIGZpY2hpZXJzIGZvcm1hbnQgbGUgY29ycHVzKSBhdmVjIGxhIG3Dqm1lIGNoYcOubmUgZGUgY2FyYWN0w6hyZXMgYXZhbnQgbCd1bmRlcnNjb3JlIChpY2kgY2hhcXVlIGF1dGV1cikgb250IGxhIG3Dqm1lLCBhZmluIGRlIHNpbXBsaWZpZXIgbGEgbGVjdHVyZSBkZXMgcsOpc3VsdGF0cy4KKiBgMTAwIE1GV2AgTm91cyBhdm9ucyB1dGlsaXPDqSBsZXMgMTAwIG1vdHMgbGVzIHBsdXMgZnLDqXF1ZW50cy4gUGVuZGFudCBsZSB0cmFpdGVtZW50IGRlcyBkb25uw6llcywgYFN0eWxvYCBhIGfDqW7DqXLDqSBxdWVscXVlcyBmaWNoaWVycyBxdWkgbm91cyBwZXJtZXR0ZW50IGRlIHZvaXIgcXVlbHMgc29udCBjZXMgbW90cywgYWluc2kgcXVlIGxldXIgZnLDqXF1ZW5jZS4gQWxsZXogZGFucyB2b3RyZSBkb3NzaWVyIGRlIHRyYXZhaWwsIGV0IHJlZ2FyZGV6IGxlcyBkb2N1bWVudHMgYHdvcmRsaXN0LnR4dGAgZXQgYHRhYmxlX3dpdGhfZnJlcXVlbmNpZXMudHh0YC4gTm91cyByZXZpZW5kcm9ucyBwbHVzIHRhcmQgc3VyIGNlcyBkb25uw6llcy4KKiBgQ3VsbGVkIEAgMCVgOiBMZSAqY3VsbGluZyBlc3Qgw6AgMCUqLCBjZSBxdWkgc2lnbmlmaWUgcXVlIGxlcyBtb3RzIGxlcyBwbHVzIGZyw6lxdWVudHMgcGV1dmVudCDDqnRyZSBhYnNlbnRzIGRlIGNlcnRhaW5zIHRleHRlcy4gVW4gY3VsbGluZyDDoCAxMDAlIHNpZ25pZmllcmFpdCBxdWUgbm91cyBuZSByZXRpZW5kcmlvbnMgcXVlIGxlcyBtb3RzIGxlcyBwbHVzIGZyw6lxdWVudHMgcmV0ZW51cyBkYW5zICoqdG91cyoqIGxlcyB0ZXh0ZXMuCiogYE1hbmhhdHRhbiBkaXN0YW5jZWA6IE5vdXMgYXZvbnMgdXRpbGlzw6kgbGEgZGlzdGFuY2UgZGl0ZSAiZGUgTWFuaGF0dGFuIiwgbWFpcyBpbCBlbiBleGlzdGUgZCdhdXRyZXM6CiAgICArIGNlcnRhaW5lcyBzb250IHBhcnRhZ8OpZXMgcGFyIHRvdXMgbGVzIG1hdGjDqW1hdGljaWVucyAoZXVjbGlkaWVubmUsIENhbmJlcnJhLCAqZXRjLiopLgogICAgKyBjZXJ0YWluZXMgc29udCBwbHVzIHNww6ljaWZpcXVlcyDDoCBsYSBzdHlsb23DqXRyaWUgKGRlbHRhIGNsYXNzaWMgb3UgImRpc3RhbmNlIGRlIEJ1cnJvd3MiLCBjb3NpbmUgZGVsdGEgb3UgImRpc3RhbmNlIGRlIFfDvHJ6YnVyZyIsICpldGMuKikuCgojIzIuMyBDb250csO0bGVyIGxhIGZpYWJpbGl0w6kgZGVzIHLDqXN1bHRhdHM6IHLDqXDDqXRlciBsJ29ww6lyYXRpb25zIGF2ZWMgZCdhdXRyZXMgcGFyYW3DqHRyZXMKCk5vdXMgYXZvbnMgb2J0ZW51IHVuIGNsdXN0ZXI6IGlsIGVzdCBwbGF1c2libGUsIG1haXMgZXN0LWlsIGZpYWJsZT8gTm91cyBhdm9ucyBiZXNvaW4gZCdlbmNvcmUgcGx1cyBkZSBjZXJ0aXR1ZGVz4oCmIFVuZSBwcmVtacOocmUgc29sdXRpb24gZXN0IGRlIHLDqXDDqXRlciBsZSBtw6ptZSBjbGFjdWwsIGVuIGF1Z21lbnRhbnQgbGUgbm9tYnJlIGRlcyBtb3RzIGxlcyBwbHVzIGZyw6lxdWVudHM6IHBhc3NvbnMgZGUgMTAwIMOgIDEwMDAuCgpgYGB7cn0Kc3R5bG8oZ3VpPUZBTFNFLCBjb3JwdXMuZGlyID0gImNvcnB1cyIsCiAgICAgIGNvcnB1cy5mb3JtYXQgPSAieG1sLmRyYW1hIiwgY29ycHVzLmxhbmcgPSAiRnJlbmNoIiwKICAgICAgYW5hbHl6ZWQuZmVhdHVyZXMgPSAidyIsIG1mdy5taW4gPSAxMDAwLCBtZncubWF4ID0gMTAwLCBtZncuaW5jcj0xMDAsCiAgICAgIGFuYWx5c2lzLnR5cGUgPSAiQ0EiLCBkaXN0YW5jZS5tZWFzdXJlID0gIm1hbmhhdHRhbiIsCiAgICAgIHBjYS52aXN1YWwuZmxhdm91ciA9ICJjbGFzc2ljIikKYGBgCgpMZXMgcsOpc3VsdGF0IGVzdCBkw6lqw6AgbW9pbnMgbmV04oCmIMOAIHF1ZWwgbW9tZW50IGR1IGJydWl0IGEtdC1pbCBjb21tZW5jw6kgw6AgcGVydHVyYmVyIGxhIGZvcm1hdGlvbiBkZXMgZ3JvdXBlcz8gQWZpbiBkZSBsZSBzYXZvaXIsIG5vdXMgcG91dm9ucyBkZW1hbmRlciDDoCBgU3R5bG9gIGRlIHLDqXDDqXRlciBsJ2FuYWx5c2UgZGUgY2x1c3RlciB1biBjZXJ0YWluIG5vbWJyZSBkZSBmb2lzIGVudHJlIDEwMCBldCAxMDAwLgoKRGVtYW5kb25zIMOgIGBTdHlsb2AgZGUgcmVmYWlyZSBsZSBjYWxjdWxzIGRpeCBmb2lzLCBlbiBpbmNyw6ltZW50YW50IGRlIDEwMCDDoCBjaGFxdWUgZm9pcy4KCmBgYHtyfQpzdHlsbyhndWk9RkFMU0UsIGNvcnB1cy5kaXIgPSAiY29ycHVzIiwKICAgICAgY29ycHVzLmZvcm1hdCA9ICJ4bWwuZHJhbWEiLCBjb3JwdXMubGFuZyA9ICJGcmVuY2giLAogICAgICBhbmFseXplZC5mZWF0dXJlcyA9ICJ3IiwgbWZ3Lm1pbiA9IDEwMCwgbWZ3Lm1heCA9IDEwMDAsIG1mdy5pbmNyPTEwMCwKICAgICAgYW5hbHlzaXMudHlwZSA9ICJDQSIsIGRpc3RhbmNlLm1lYXN1cmUgPSAibWFuaGF0dGFuIiwKICAgICAgcGNhLnZpc3VhbC5mbGF2b3VyID0gImNsYXNzaWMiKQpgYGAKCkRpZmZpY2lsZSBjZXBlbmRhbnQgZGUgY29tcGFyZXIgZmFjaWxlbWVudCAxMCBkZW5kb2dyYW1tZXPigKYgRXQgY29tbWVudCBmYWlyZSBwb3VyIDIwLCAzMCBvdSAxMDAwIGRlbmRvZ3JhbW1lcz8KCiMjMi40IENvbnRyw7RsZXIgYXV0cmVtZW50IGxhIGZpYWJpbGl0w6kgZGVzIHLDqXN1bHRhdHM6IGxlICpjb25zZW5zdXMgdHJlZSoKCklsIGVzdCBwb3NzaWJsZSBkZSByZXByw6lzZW50ZXIgZ3JhcGhpcXVlbWVudCBsYSBzb21tZSBkZSBjZXMgaW5mb3JtYXRpb25zOiBpbCBzJ2FnaXQgZHUgKmNvbmNlbnN1cyB0cmVlKiAoImFyYnJlIGRlIGNvbnNlbnN1cyIsIGVuIGZyYW7Dp2FpcykuIFZveW9ucyBsYSBmb3JtZSBkZSBjZSBncmFwaGlxdWUgYXZlYyBsZXMgcsOpc3VsdGF0cyBxdWUgbm91cyB2ZW5vbnMgZCdvYnRlbmlyLgoKYGBge3J9CnN0eWxvKGd1aT1GQUxTRSwgY29ycHVzLmRpciA9ICJjb3JwdXMiLAogICAgICBjb3JwdXMuZm9ybWF0ID0gInhtbC5kcmFtYSIsIGNvcnB1cy5sYW5nID0gIkZyZW5jaCIsCiAgICAgIGFuYWx5emVkLmZlYXR1cmVzID0gInciLCBtZncubWluID0gMTAwLCBtZncubWF4ID0gMTAwMCwgbWZ3LmluY3I9MTAwLAogICAgICBhbmFseXNpcy50eXBlID0gIkJDVCIsIGNvbnNlbnN1cy5zdHJlbmd0aCA9IDAuNSwgIGRpc3RhbmNlLm1lYXN1cmUgPSAibWFuaGF0dGFuIiwKICAgICAgcGNhLnZpc3VhbC5mbGF2b3VyID0gImNsYXNzaWMiKQpgYGAKCkMnZXN0IGwnb2NjYXNpb24gZGUgY2hhbmdlciBkYW5zIGxhIG3DqXRob2RlIGRlIGNhbGN1bCBkZSBkaXN0YW5jZSwgcG91ciB2w6lyaWZpZXIgbGVzIHBlcmZvcm1hbmNlcyBkZSBjaGFjdW5lLiBOb3VzIHV0aWxpc2lvbnMganVzcXUnw6AgcHLDqXNlbnQgbGEgImRpc3RhbmNlIGRlIE1hbmhhdHRhbiIsIGVzc2F5b25zIGNldHRlIGZvaXMgYXZlYyB1bmUgZGlzdGFuY2UgZXVjbGlkaWVubmUuCgpgYGB7cn0Kc3R5bG8oZ3VpPUZBTFNFLCBjb3JwdXMuZGlyID0gImNvcnB1cyIsCiAgICAgIGNvcnB1cy5mb3JtYXQgPSAieG1sLmRyYW1hIiwgY29ycHVzLmxhbmcgPSAiRnJlbmNoIiwKICAgICAgYW5hbHl6ZWQuZmVhdHVyZXMgPSAidyIsIG1mdy5taW4gPSAxMDAsIG1mdy5tYXggPSAxMDAwLCBtZncuaW5jcj0xMDAsCiAgICAgIGFuYWx5c2lzLnR5cGUgPSAiQkNUIiwgY29uc2Vuc3VzLnN0cmVuZ3RoID0gMC41LCAgZGlzdGFuY2UubWVhc3VyZSA9ICJldWNsaWRlYW4iLAogICAgICBwY2EudmlzdWFsLmZsYXZvdXIgPSAiY2xhc3NpYyIpCmBgYAoKRXQgbWFpbnRlbmFudCBhdmVjIHVuZSBkaXN0YW5jZSB0eXBpcXVlIGRlIGxhIHN0eWxvbcOpdHJpZTogbGEgZGlzdGFuY2UgZGUgQnVycm93cyAoZHUgbm9tIGRlIHNvbiBpbnZlbnRldXIsIEpvaG4gQnVycm93cyksIGF1c3NpIGFwcGVsw6llICJjbGFzc2ljIGRlbHRhIi4KCmBgYHtyfQpzdHlsbyhndWk9RkFMU0UsIGNvcnB1cy5kaXIgPSAiY29ycHVzIiwKICAgICAgY29ycHVzLmZvcm1hdCA9ICJ4bWwuZHJhbWEiLCBjb3JwdXMubGFuZyA9ICJGcmVuY2giLAogICAgICBhbmFseXplZC5mZWF0dXJlcyA9ICJ3IiwgbWZ3Lm1pbiA9IDEwMCwgbWZ3Lm1heCA9IDEwMDAsIG1mdy5pbmNyPTEwMCwKICAgICAgYW5hbHlzaXMudHlwZSA9ICJCQ1QiLCBjb25zZW5zdXMuc3RyZW5ndGggPSAwLjUsICBkaXN0YW5jZS5tZWFzdXJlID0gImRlbHRhIiwKICAgICAgcGNhLnZpc3VhbC5mbGF2b3VyID0gImNsYXNzaWMiKQpgYGAKCkNvbXBhcmV6IGxlcyByw6lzdWx0YXRzIG9idGVudXMgYXZlYyBjZXMgZGlmZsOpcmVudGVzIG3DqXRob2RlIGRlIGNhbGN1bC4gUsOpZmxlY2hpc3NleiDDoCBjZSBkaWxlbW1lOiBsYSBkaWZmw6lyZW5jZSBlbnRyZSBsZXMgcsOpc3VsdGF0cyBzaWduaWZpZS10LWVsbGUgCgoqIHF1ZSBsZXMgcsOpc3VsdGF0cyBuZSBzb250IHBhcyBmaWFibGVzPwoqIHF1ZSBjZXJ0YWlucyBjYWxjdWxzIGRlIGRpc3RhbmNlIG5lIHNvbnQgcGFzIGZpYWJsZXM/Ciogb3UgYmllbiBxdWUgbCdvbiBuZSBwZXV0IHJpZW4gZMOpZHVpcmUgZGUgY2UgY29ycHVzPwoKIyMyLjUgUydhcHB1eWVyIHN1ciBkJ2F1dHJlcyBleHDDqXJpZW5jZXMKCkVuIHBsdXMgZGUgY2V0dGUgYXBwcm9jaGUgZW1waXJpcXVlLCBpbCBlc3QgaW1wb3J0YW50IGRlIHMnYXBwdXllciBzdXIgZGVzIMOpdHVkZXMgcXVpIHByw6ljaXNlbnQgbGVzIHBhcmFtw6h0cmVzIGxlcyBwbHVzIGVmZmljYWNlcy4gU2Vsb24gRXZlcnQsIFByb2lzbCwgSmFubmlkaSwgUmVnZXIsIFBpZWxzdHLDtm0sIFNjaMO2Y2gsIFZpdHQgKDIwMTcpLCA1MDAwIG1vdHMgTUZXIGF2ZWMgY29zaW5lIGRlbHRhIHNlcmFpdCBsZSBwbHVzIGVmZmljYWNlICh5IGNvbXByaXMgcG91ciBsZSBmcmFuw6dhaXMpOgoKIVsxMDAlIGNlbnRlcl0oaW1hZ2VzL251bWJlcnMucG5nKQoKRXZlcnQsIFByb2lzbCwgSmFubmlkaSwgUmVnZXIsIFBpZWxzdHLDtm0sIFNjaMO2Y2gsIFZpdHQsICIgVW5kZXJzdGFuZGluZyBhbmQgZXhwbGFpbmluZyBEZWx0YSBtZWFzdXJlcyBmb3IgYXV0aG9yc2hpcCBhdHRyaWJ1dGlvbiIsX0RpZ2l0YWwgU2Nob2xhcnNoaXAgaW4gdGhlIEh1bWFuaXRpZXNfLCBWb2x1bWUgMzIsIERlY2VtYmVyIDIwMTcsIFBhZ2VzIGlpNOKAk2lpMTYsIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDkzL2xsYy9mcXgwMjMKCmBgYHtyfQpzdHlsbyhndWk9RkFMU0UsIGNvcnB1cy5kaXIgPSAiY29ycHVzIiwKICAgICAgY29ycHVzLmZvcm1hdCA9ICJ4bWwuZHJhbWEiLCBjb3JwdXMubGFuZyA9ICJGcmVuY2giLAogICAgICBhbmFseXplZC5mZWF0dXJlcyA9ICJ3IiwgbWZ3Lm1pbiA9NTAwMCwgbWZ3Lm1heCA9IDEwMCwgbWZ3LmluY3I9MTAwLAogICAgICBhbmFseXNpcy50eXBlID0gIkNBIiwgZGlzdGFuY2UubWVhc3VyZSA9ICJ3dXJ6YnVyZyIsCiAgICAgIHBjYS52aXN1YWwuZmxhdm91ciA9ICJjbGFzc2ljIikKYGBgCgoKIzMuIEZvbmN0aW9ubmVtZW50IGRlIGBzdHlsb2AKCkxlcyBkb25uw6llcyB1dGlsaXPDqWVzIHBlbmRhbnQgbCdhbmFseXNlIHN0eWxvbcOpdHJpcXVlIHNvbnQgYWNjZXNzaWJsZXM6IHBvdXIgbGVzIHZvaXIsIG5vdXMgZGV2b25zIGRvbmMgY3LDqWVyIHVuZSB2YXJpYWJsZSBldCBsZXMgc3RvY2tlci4gQXBwZWxvbnMgbGEgdmFyaWFibGUgInJlc3VsdGF0cyIsIHF1aSBzJ3V0aWxpc2UgYWluc2k6CgpgYGB7cn0KcmVzdWx0YXRzIDwtIHN0eWxvKGd1aT1GQUxTRSwgY29ycHVzLmRpciA9ICJjb3JwdXMiLAogICAgICBjb3JwdXMuZm9ybWF0ID0gInhtbC5kcmFtYSIsIGNvcnB1cy5sYW5nID0gIkZyZW5jaCIsCiAgICAgIGFuYWx5emVkLmZlYXR1cmVzID0gInciLCBtZncubWluID0gNTAwMCwgbWZ3Lm1heCA9IDEwMCwgbWZ3LmluY3I9MTAwLAogICAgICBhbmFseXNpcy50eXBlID0gIkNBIiwgZGlzdGFuY2UubWVhc3VyZSA9ICJ3dXJ6YnVyZyIsCiAgICAgIHBjYS52aXN1YWwuZmxhdm91ciA9ICJjbGFzc2ljIikKYGBgCgpWb3lvbnMgY2UgcXVlIG5vdXMgZG9ubmUgY2V0dGUgdmFyaWFibGU6CgpgYGB7cn0KcmVzdWx0YXRzCmBgYAoKTGVzIGRvbm7DqWVzIHNvbnQgbm9tYnJldXNlczogb24gbm91cyByZWRpcmlnZSB2ZXJzIHVuZSBzb3J0ZSBkZSBwb3J0YWlsIGF2ZWMgbGVzIGRpZmbDqXJlbnRlcyBkb25uw6llcyBjb2xsZWN0w6llcywgcXVlIGwnb24gcGV1dCBjb25zdWx0ZXIgYXZlYyBsZSBjb2RlIHN1aXZhbnQ6CgpgYGB7cn0Kc3VtbWFyeShyZXN1bHRhdHMpCmBgYAoKUGx1c2lldXJzIHZhcmlhYmxlcyBzb250IGRpcG9uaWJsZXMuIGBmZWF0dXJlc2AgcGVybWV0IGQnYWZmaWNoZXIgbGEgbGlzdGUgZGVzIG1vdHMgcGFyIG9yZHJlIGRlIGZyw6lxdWVuY2U6CgpgYGB7cn0KcmVzdWx0YXRzJGZlYXR1cmVzCmBgYAoKQ2VzIG1vdHMgc29udCBjbGFzc8OpcyBkdSBwbHVzIGF1IG1vaW5zIGZyw6lxdWVudCBkYW5zIGxlIGNvcnB1cy4gTm91cyBwb3V2b25zIHZvaXIgbGV1ciBmcsOpcXVlbmNlIHBhciB0ZXh0ZSBhdmVjIGxhIHZhcmlhYmxlIGB0YWJsZS53aXRoLmFsbC5mcmVxc2AKCmBgYHtyfQpyZXN1bHRhdHMkdGFibGUud2l0aC5hbGwuZnJlcXMKYGBgCgpPbiBwZXV0IHZvaXIgY2VzIHNjb3JlcyB6LXRyYW5zZm9ybcOpcyBhdmVjIGAkdGFibGUud2l0aC5hbGwuenNjb3Jlc2AKCmBgYHtyfQpyZXN1bHRhdHMkdGFibGUud2l0aC5hbGwuenNjb3JlcwpgYGAKCkNlcyByw6lzdWx0YXRzIHBlcm1ldHRlbnQgZCfDqXZhbHVlciBsYSBkaXN0YW5jZSBlbnRyZSBjaGFjdW4gZGVzIHRleHRlcyBkZSBub3RyZSBjb3JwdXMuIENldHRlIGZvaXMgbGVzIHLDqXN1bHRhdHMgc29udCBhY2Nlc3NpYmxlcyBhdmVjIGxlIG5vbSBkZSBub3RyZSB2YXJpYWJsZSBzdWl2aSBkZSBgJGRpc3RhbmNlLnRhYmxlYAoKYGBge3J9CnJlc3VsdGF0cyRkaXN0YW5jZS50YWJsZSAKYGBgCgpDJ2VzdCBkb25jIMOgIHBhcnRpciBkZSBjZXMgZnLDqXF1ZW5jZXMsIHB1aXMgZGUgY2VzIGRpc3RhbmNlcyBxdWUgbm91cyBvYnRlbm9ucyBsZXMgZGVuZG9ncmFtbWVzIHF1ZSBub3VzIGF2b25zIHZ1cyBwcsOpY8OpZGVtbWVudC4KCiM0LiBEJ2F1dHJlcyB2aXN1YWxpc2F0aW9ucwoKIyM0LjEgKlByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMqCgpVbiBhdXRyZSBtb2RlIGRlIHZpc3VhbGlzYXRpb24gZXN0IGxlICpwcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzKiAoIkFuYWx5c2UgZW4gY29tcG9zYW50ZXMgcHJpbmNpcGFsZXMiIGVuIGZyYW7Dp2FpcyksIHF1aSBwZXJtZXQgbHVpIGF1c3NpIGRlIHNwYXRpYWxpc2VyIGxlcyByw6lzdWx0YXRzLCBzZWxvbiB1bmUgYXV0cmUgw6l0aG9kZSBkZSBjYWxjdWwuCgojIyM0LjEuMSAqUHJpbmNpcGFsIGNvbXBvbmVudCBhbmFseXNpcyogY2xhc3NpcXVlCgpgYGB7cn0Kc3R5bG8oZ3VpPUZBTFNFLCBjb3JwdXMuZGlyID0gImNvcnB1cyIsCiAgICAgIGNvcnB1cy5mb3JtYXQgPSAieG1sLmRyYW1hIiwgY29ycHVzLmxhbmcgPSAiRnJlbmNoIiwKICAgICAgYW5hbHl6ZWQuZmVhdHVyZXMgPSAidyIsIG1mdy5taW4gPSA1MDAwLCBtZncubWF4ID0gMTAwLCBtZncuaW5jcj0xMDAsCiAgICAgIGFuYWx5c2lzLnR5cGUgPSAiUENWIiwgIGRpc3RhbmNlLm1lYXN1cmUgPSAid3VyemJ1cmciLAogICAgICBwY2EudmlzdWFsLmZsYXZvdXIgPSAiY2xhc3NpYyIpCmBgYAoKIyMjNC4xLjIgKlByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMqIChhdmVjIGxlcyBtb3RzIGVuIHN1cGVycG9zaXRpb24pCgpJbCBlc3QgcG9zc2libGUgZGUgc3VwZXJwb3NlciBsZXMgdG9rZW5zIChpY2kgbGVzIG1vdHMpIGF1eCBsYWJlbHMsIGFmaW4gZGUgY29tcHJlbmRyZSBzdXIgcXVlbGxlcyBkb25uw6llcyBsZXhpY2FsZXMgcydhcHB1aWUgbGEgc3BhdGlhbGlzYXRpb24uCgpgYGB7cn0Kc3R5bG8oZ3VpPUZBTFNFLCBjb3JwdXMuZGlyID0gImNvcnB1cyIsCiAgICAgIGNvcnB1cy5mb3JtYXQgPSAieG1sLmRyYW1hIiwgY29ycHVzLmxhbmcgPSAiRnJlbmNoIiwKICAgICAgYW5hbHl6ZWQuZmVhdHVyZXMgPSAidyIsIG1mdy5taW4gPSA1MDAwLCBtZncubWF4ID0gMTAwLCBtZncuaW5jcj0xMDAsCiAgICAgIGFuYWx5c2lzLnR5cGUgPSAiUENWIiwgIGRpc3RhbmNlLm1lYXN1cmUgPSAid3VyemJ1cmciLAogICAgICBwY2EudmlzdWFsLmZsYXZvdXIgPSAibG9hZGluZ3MiKQpgYGAKCk9uIGxlIHZvaXQsIGxhIHBsdXBhcnQgZGVzIHRva2VucyBheWFudCBkZXMgZnLDqXF1ZW5jZXMgdHLDqHMgZmFpYmxlLCBvbiBzZSByZXRyb3V2ZSBhdmVjIHVuICJ0YXMiIGRlIG1vdHMgYXUgY2VudHJlLCBjZSBxdWkgcmVuZCBsZXMgZG9ubsOpZXMgaWxsaXNpYmxlc+KApiBDb21tZW50IGZhaXJlPwoKKiBBbGxlciBjaGVyY2hlciBsZXMgZG9ubsOpZXMgYnJ1dGVzLCBtYWlzIG9uIHBlcmQgbCdhdmFudGFnZSBkZSBsYSB2aXN1YWxpc2F0aW9uLgoqIFRlbnRlciAiZCfDqXRpcmVyIiBsYSBwYXJ0aWUgY2VudHJhbGUuCgojIyM0LjEuMyAqUHJpbmNpcGFsIGNvbXBvbmVudCBhbmFseXNpcyo6IGxlcyBjbGFzc2VzCgpOb3VzIGF2b25zIHZ1IGF1IGNvdXJzIHByw6ljw6lkZW50IHF1J2lsIGVzdCBpbXBvcnRhbnQgZGUgY29udHLDtGxlciBsYSBzaWduaWZpY2F0aXZpdMOpIGRlcyBheGVzIHByb2R1aXRzOiBub3VzIG5lIHBvdXZvbnMgY2VwZW5kYW50IHBhcyBsZSBmYWlyZSBhdmVjIGBzdHlsbygpYCwgZXQgaWwgZmF1dCBzZSB0b3VybmVyIHZlcnMgdW4gYXV0cmUgcGFzY2thZ2U6IGBGYWN0b01pbmVSYC4KCkxhIHByZW1pw6hyZSDDqXRhcGUgZXN0IGRlIHLDqWN1cMOpcmVyIGxlcyBmcsOpcXVlbmNlcyBxdWkgbm91cyBpbnTDqXJlc3NlbnQgcG91ciBsZXMgcsOpdXRpbGlzZXIgcGx1cyB0YXJkOgoKYGBge3J9CiNKZSBwcmVuZHMgbGVzIGZyw6lxdWVuY2VzIHBhciB0ZXh0ZSBwcm9kdWl0ZXMgcGFyIHN0eWxvCnJlc3VsdGF0cyR0YWJsZS53aXRoLmFsbC5mcmVxcwojIGplIHJldG91cm5lIGxlIHRhYmxlYXUgcG91ciBhdm9pciB1biBtb3QgcGFyIHJhbmcKdGhlYXRyZUZyZXF1ZW5jZXM8LXQocmVzdWx0YXRzJHRhYmxlLndpdGguYWxsLmZyZXFzKQojIGplIG5lIGdhcmRlIHF1ZSBsZXMgMTAwIHByZW1pZXJzIG1vdHMKaGVhZCh0aGVhdHJlRnJlcXVlbmNlc1sxOjEwMCxdKQojSmUgcGV1eCDDqXZpZGVtbWVudCB0b3V0IGZhaXJlIGQndW4gY291cDoKI3RoZWF0cmVGcmVxdWVuY2VzPC10KHJlc3VsdGF0cyR0YWJsZS53aXRoLmFsbC5mcmVxcylbMToxMDAsXQpgYGAKCkplIHBldXggZMOpc29ybWFpcyBjb250csO0bGVyIGxhIHNpZ25pZmljYXRpdml0w6kgZGVzIGF4ZXMgcHJvZHVpdHM6CgpgYGB7cn0KaWYoIXJlcXVpcmUoIkZhY3RvTWluZVIiKSl7CiAgaW5zdGFsbC5wYWNrYWdlcygiRmFjdG9NaW5lUiIpCiAgbGlicmFyeShGYWN0b01pbmVSKQp9CnRoZWF0cmVGcmVxdWVuY2VzUENBID0gUENBKHQodGhlYXRyZUZyZXF1ZW5jZXMpKQpiYXJwbG90KHRoZWF0cmVGcmVxdWVuY2VzUENBJGVpZ1ssMV0sIG1haW49IkVpZ2VudmFsdWVzIiwgbmFtZXMuYXJnPTE6bnJvdyh0aGVhdHJlRnJlcXVlbmNlc1BDQSRlaWcpKQoKYGBgCgpNYWlzIG5vdXMgYWxsb25zIHVuIHBldSB2aXRlOiByYWxlbnRpc3NvbnMgdW4gcGV1LCBub3VzIHJldmllbmRyb25zIMOgIGNlcyBxdWVzdGlvbnMgbGUgY291cnMgcHJvY2hhaW4uCgojIzQuMiAqUHJpbmNpcGFsIGNvbXBvbmVudCBhbmFseXNpcyogKGF2ZWMgY29ycmVsYXRpb24pCgpJbCBlc3QgcG9zc2libGUgZGUgbW9kaWZpZXIgbGVzIHLDqXN1bHRhdHMgYWZpbiBkJ2FjY2VudHVlciBkZSBtYW5pw6hyZSBwcm9wb3J0aW9ubmVsbGUgbGEgZGlzdGFuY2UgZW50cmUgbGVzIGRpZmbDqXJlbnRzIHRva2VucyBwb3VyICJhw6lyZXIiIGxhIHBhcnRpZSBjZW50cmFsZSBlbiBtb2RpZmlhbnQgbMOpZ8OocmVtZW50IGxhIG3DqXRob2RlIGRlIGNhbGN1bC4KCmBgYHtyfQpzdHlsbyhndWk9RkFMU0UsIGNvcnB1cy5kaXIgPSAiY29ycHVzIiwKICAgICAgY29ycHVzLmZvcm1hdCA9ICJ4bWwuZHJhbWEiLCBjb3JwdXMubGFuZyA9ICJGcmVuY2giLAogICAgICBhbmFseXplZC5mZWF0dXJlcyA9ICJ3IiwgbWZ3Lm1pbiA9IDEwMCwgbWZ3Lm1heCA9IDEwMCwgbWZ3LmluY3I9MTAwLAogICAgICBhbmFseXNpcy50eXBlID0gIlBDUiIsICBkaXN0YW5jZS5tZWFzdXJlID0gImRlbHRhIiwKICAgICAgcGNhLnZpc3VhbC5mbGF2b3VyID0gImxvYWRpbmdzIikKYGBgCgpJbCBlc3QgYWluc2kgcG9zc2libGUgZCdhc3NvY2llciBjZXJ0YWlucyB0b2tlbnMgw6AgZGVzIGF1dGV1cnMsIG91IGRlcyBncm91cGVzIGQnYXV0ZXVycy4KCkVuIGJhcyBkdSBncmFwaGlxdWUsIG9uIHRyb3V2ZSB1biBwb3VyY2VudGFnZTogaWwgbm91cyBkb25uZSB1bmUgaWTDqWUgZGUgbGEgZGlzdG9ydGlvbiBhcHBvcnTDqWUgYXUgcsOpc3VsdGF0IHByw6ljw6lkZW50IHBvdXIgYWNjZW50dWVyIGwnZXNwYWNlIGVudHJlIGxlcyBtb3RzLCBldCBkb25jIGxlIGRlZ3LDqSBkZSBmaWFiaWxpdMOpIGR1IHLDqXN1bHRhdC4gT24gcmVtYXJxdWUgbGEgY29ycmVsYXRpb24gYSBmYWl0IHBlcmRyZSBkZSBsYSBzaWduaWZpY2F0aXZpdMOpIGF1IHByZW1pZXIgYXhlLgoKIyM0LjMgKk11bHRpZGltZW5zaW9uYWwgc2NhbGluZyoKClVuIG1vZGUgZGUgdmlzdWFsaXNhdGlvbiBkZXMgZG9ubsOpZXMgYXNzZXogY29tbXVuIGVzdCBsZSAqTXVsdGlkaW1lbnNpb25hbCBzY2FsaW5nKiAoInBvc2l0aW9ubmVtZW50IG11bHRpZGltZW5zaW9ubmVsIiBlbiBmcmFuw6dhaXMpLiBQb3VyIGZhaXJlICh0csOocywgdHLDqHMpIHNpbXBsZSwgaWwgcydhZ2l0IGRlIHNwYXRpYWxpc2VyIGxlcyByw6lzdWx0YXRzLgoKYGBge3J9CnN0eWxvKGd1aT1GQUxTRSwgY29ycHVzLmRpciA9ICJjb3JwdXMiLAogICAgICBjb3JwdXMuZm9ybWF0ID0gInhtbC5kcmFtYSIsIGNvcnB1cy5sYW5nID0gIkZyZW5jaCIsCiAgICAgIGFuYWx5emVkLmZlYXR1cmVzID0gInciLCBtZncubWluID0gMTAwLCBtZncubWF4ID0gMTAwLCBtZncuaW5jcj0xMDAsCiAgICAgIGFuYWx5c2lzLnR5cGUgPSAiTURTIiwgIGRpc3RhbmNlLm1lYXN1cmUgPSAid3VyemJ1cmciLAogICAgICBwY2EudmlzdWFsLmZsYXZvdXIgPSAiY2xhc3NpYyIpCmBgYAoKVW4gZGVzIGludMOpcsOqdHMgZGUgY2UgdHlwZSBkZSB2aXN1YWxpc2F0aW9uIGVzdCBkJ2lkZW50aWZpZXIgbGVzIGF1dGV1cnMgYXZlYyBsZXMgc3R5bGVzIGxlcyBwbHVzIG5ldXRyZXMsIGV0IGNldXggYXZlYyBsZXMgc3R5bGVzIGxlcyBwbHVzIG1hcnF1w6lzLgoKI0NvbmNsdXNpb246IHZlcnMgbCdhbmFseXNlIGRlIHLDqXNlYXUKCmBgYHtyfQppZighcmVxdWlyZSgibmV0d29ya0QzIikpewogIGluc3RhbGwucGFja2FnZXMoIm5ldHdvcmtEMyIpCiAgbGlicmFyeSgibmV0d29ya0QzIikKfQpgYGAKCgpgYGB7cn0Kc3R5bG8ubmV0d29yayhndWk9RkFMU0UsIGNvcnB1cy5kaXIgPSAiY29ycHVzIiwKICAgICAgICAgICAgICBjb3JwdXMuZm9ybWF0ID0gInhtbC5kcmFtYSIsIGNvcnB1cy5sYW5nID0gIkZyZW5jaCIsCiAgICAgICAgICAgICAgYW5hbHl6ZWQuZmVhdHVyZXMgPSAidyIsIG1mdy5taW4gPSAxNzAwLCBtZncubWF4ID0gMTAwLCBtZncuaW5jcj0xMDAsCiAgICAgICAgICAgICAgYW5hbHlzaXMudHlwZSA9ICJDQSIsIGRpc3RhbmNlLm1lYXN1cmUgPSAid3VyemJ1cmciLAogICAgICAgICAgICAgIHBjYS52aXN1YWwuZmxhdm91ciA9ICJjbGFzc2ljIikKYGBgCg==